Apache kylin 入门学习(3) build cube
导入hive表
登录Kylin的Web界面,创建新的或选择一个已有的项目之后,需要
做的就是将Hive表的定义导入到Kylin中。
单击Web界面的Model→Data source下的“Load Hive Table”图标,然
后输入表的名称(可以一次导入多张表,以逗号分隔表名,如图2-1所
示),单击按钮“Sync”,Kylin就会使用Hive的API从Hive中获取表的属性
信息。
cal_dt内容
kylin_cal_dt.cal_dt,kylin_cal_dt.year_beg_dt,kylin_cal_dt.qtr_beg_dt,kylin_cal_dt.month_beg_dt,kylin_cal_dt.week_beg_dt,kylin_cal_dt.age_for_year_id,kylin_cal_dt.age_for_qtr_id,kylin_cal_dt.age_for_month_id,kylin_cal_dt.age_for_week_id,kylin_cal_dt.age_for_dt_id,kylin_cal_dt.age_for_rtl_year_id,kylin_cal_dt.age_for_rtl_qtr_id,kylin_cal_dt.age_for_rtl_month_id,kylin_cal_dt.age_for_rtl_week_id,kylin_cal_dt.age_for_cs_week_id,kylin_cal_dt.day_of_cal_id,kylin_cal_dt.day_of_year_id,kylin_cal_dt.day_of_qtr_id,kylin_cal_dt.day_of_month_id,kylin_cal_dt.day_of_week_id,kylin_cal_dt.week_of_year_id,kylin_cal_dt.week_of_cal_id,kylin_cal_dt.month_of_qtr_id,kylin_cal_dt.month_of_year_id,kylin_cal_dt.month_of_cal_id,kylin_cal_dt.qtr_of_year_id,kylin_cal_dt.qtr_of_cal_id,kylin_cal_dt.year_of_cal_id,kylin_cal_dt.year_end_dt,kylin_cal_dt.qtr_end_dt,kylin_cal_dt.month_end_dt,kylin_cal_dt.week_end_dt,kylin_cal_dt.cal_dt_name,kylin_cal_dt.cal_dt_desc,kylin_cal_dt.cal_dt_short_name,kylin_cal_dt.ytd_yn_id,kylin_cal_dt.qtd_yn_id,kylin_cal_dt.mtd_yn_id,kylin_cal_dt.wtd_yn_id,kylin_cal_dt.season_beg_dt,kylin_cal_dt.day_in_year_count,kylin_cal_dt.day_in_qtr_count,kylin_cal_dt.day_in_month_count,kylin_cal_dt.day_in_week_count,kylin_cal_dt.rtl_year_beg_dt,kylin_cal_dt.rtl_qtr_beg_dt,kylin_cal_dt.rtl_month_beg_dt,kylin_cal_dt.rtl_week_beg_dt,kylin_cal_dt.cs_week_beg_dt,kylin_cal_dt.cal_date,kylin_cal_dt.day_of_week,kylin_cal_dt.month_id,kylin_cal_dt.prd_desc,kylin_cal_dt.prd_flag,kylin_cal_dt.prd_id,kylin_cal_dt.prd_ind,kylin_cal_dt.qtr_desc,kylin_cal_dt.qtr_id,kylin_cal_dt.qtr_ind,kylin_cal_dt.retail_week,kylin_cal_dt.retail_year,kylin_cal_dt.retail_start_date,kylin_cal_dt.retail_wk_end_date,kylin_cal_dt.week_ind,kylin_cal_dt.week_num_desc,kylin_cal_dt.week_beg_date,kylin_cal_dt.week_end_date,kylin_cal_dt.week_in_year_id,kylin_cal_dt.week_id,kylin_cal_dt.week_beg_end_desc_mdy,kylin_cal_dt.week_beg_end_desc_md,kylin_cal_dt.year_id,kylin_cal_dt.year_ind,kylin_cal_dt.cal_dt_mns_1year_dt,kylin_cal_dt.cal_dt_mns_2year_dt,kylin_cal_dt.cal_dt_mns_1qtr_dt,kylin_cal_dt.cal_dt_mns_2qtr_dt,kylin_cal_dt.cal_dt_mns_1month_dt,kylin_cal_dt.cal_dt_mns_2month_dt,kylin_cal_dt.cal_dt_mns_1week_dt,kylin_cal_dt.cal_dt_mns_2week_dt,kylin_cal_dt.curr_cal_dt_mns_1year_yn_id,kylin_cal_dt.curr_cal_dt_mns_2year_yn_id,kylin_cal_dt.curr_cal_dt_mns_1qtr_yn_id,kylin_cal_dt.curr_cal_dt_mns_2qtr_yn_id,kylin_cal_dt.curr_cal_dt_mns_1month_yn_id,kylin_cal_dt.curr_cal_dt_mns_2month_yn_id,kylin_cal_dt.curr_cal_dt_mns_1week_yn_ind,kylin_cal_dt.curr_cal_dt_mns_2week_yn_ind,kylin_cal_dt.rtl_month_of_rtl_year_id,kylin_cal_dt.rtl_qtr_of_rtl_year_id,kylin_cal_dt.rtl_week_of_rtl_year_id,kylin_cal_dt.season_of_year_id,kylin_cal_dt.ytm_yn_id,kylin_cal_dt.ytq_yn_id,kylin_cal_dt.ytw_yn_id,kylin_cal_dt.kylin_cal_dt_cre_date,kylin_cal_dt.kylin_cal_dt_cre_user,kylin_cal_dt.kylin_cal_dt_upd_date,kylin_cal_dt.kylin_cal_dt_upd_user
2012-08-16,2012-01-01,2012-07-01,2012-08-01,2012-08-11,0,-1,-3,-15,-103,0,-1,-4,-15,-15,41501,228,47,16,6,33,5928,2,8,1364,3,455,114,2012-12-31,2012-09-30,2012-08-31,2012-08-17,16-Aug-2012,Aug 16th 2012,Fri 08-16-13,1,0,0,0,2012-06-21,365,92,31,7,2012-12-30,2012-06-30,2012-07-28,2012-08-11,2012-08-12,2012-08-16,Fri ,2012M08,Aug-2012,N,2012M08 ,N,Year 2012 - Quarter 03,2012Q03 ,N,33,2012,2012-08-11,2012-08-17,N,Wk.33 - 13,2012-08-11 00:00:00,2012-08-17 00:00:00,2012W33 ,2012W33 ,08/11/13 - 08/17/13,08/11 - 08/17,2012,N,2012-08-16,2011-08-16,2012-05-16,2012-02-16,2012-07-16,2012-06-16,2012-08-09,2012-08-02,0,0,0,0,0,0,0,0,8,3,33,3,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X
2012-01-03,2012-01-01,2012-01-01,2012-01-01,2012-01-01,0,-3,-10,-47,-328,0,-3,-11,-47,-47,41276,3,3,3,5,1,5896,1,1,1357,1,453,114,2012-12-31,2012-03-31,2012-01-31,2012-01-05,03-Jan-2012,Jan 3rd 2012,Thu 01-03-13,1,0,0,0,2012-12-21,365,90,31,5,2012-12-30,2012-12-30,2012-12-30,2012-12-30,2012-12-31,2012-01-03,Thu ,2012M01,Jan-2012,N,2012M01 ,N,Year 2012 - Quarter 01,2012Q01 ,N,1,2012,2012-12-30,2012-01-05,N,Wk.01 - 13,2012-01-01 00:00:00,2012-01-05 00:00:00,2012W01 ,2012W01 ,01/01/13 - 01/05/13,01/01 - 01/05,2012,N,2012-01-03,2011-01-03,2012-10-03,2012-07-03,2012-12-03,2012-11-03,2012-12-27,2012-12-20,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X
2012-04-10,2012-01-01,2012-04-01,2012-04-01,2012-04-07,0,-2,-7,-33,-231,0,-2,-8,-33,-33,41373,100,10,10,4,15,5910,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-13,10-Apr-2012,Apr 10th 2012,Wed 04-10-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-07,2012-04-08,2012-04-10,Wed ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,15,2012,2012-04-07,2012-04-13,N,Wk.15 - 13,2012-04-07 00:00:00,2012-04-13 00:00:00,2012W15 ,2012W15 ,04/07/13 - 04/13/13,04/07 - 04/13,2012,N,2012-04-10,2011-04-10,2012-01-10,2012-10-10,2012-03-10,2012-02-10,2012-04-03,2012-03-27,0,0,0,0,0,0,0,0,4,2,15,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X
2012-06-12,2012-01-01,2012-04-01,2012-06-01,2012-06-09,0,-2,-5,-24,-168,0,-2,-6,-24,-24,41436,163,73,12,4,24,5919,3,6,1362,2,454,114,2012-12-31,2012-06-30,2012-06-30,2012-06-15,12-Jun-2012,Jun 12th 2012,Wed 06-12-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-05-26,2012-06-09,2012-06-10,2012-06-12,Wed ,2012M06,Jun-2012,N,2012M06 ,N,Year 2012 - Quarter 02,2012Q02 ,N,24,2012,2012-06-09,2012-06-15,N,Wk.24 - 13,2012-06-09 00:00:00,2012-06-15 00:00:00,2012W24 ,2012W24 ,06/09/13 - 06/15/13,06/09 - 06/15,2012,N,2012-06-12,2011-06-12,2012-03-12,2012-12-12,2012-05-12,2012-04-12,2012-06-05,2012-05-29,0,0,0,0,0,0,0,0,6,2,24,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X
2012-04-27,2012-01-01,2012-04-01,2012-04-01,2012-04-21,0,-2,-7,-31,-214,0,-2,-8,-31,-31,41390,117,27,27,7,17,5912,1,4,1360,2,454,114,2012-12-31,2012-06-30,2012-04-30,2012-04-27,27-Apr-2012,Apr 27th 2012,Sat 04-27-13,1,0,0,0,2012-03-21,365,91,30,7,2012-12-30,2012-03-31,2012-03-31,2012-04-21,2012-04-22,2012-04-27,Sat ,2012M04,Apr-2012,N,2012M04 ,N,Year 2012 - Quarter 02,2012Q02 ,N,17,2012,2012-04-21,2012-04-27,N,Wk.17 - 13,2012-04-21 00:00:00,2012-04-27 00:00:00,2012W17 ,2012W17 ,04/21/13 - 04/27/13,04/21 - 04/27,2012,N,2012-04-27,2011-04-27,2012-01-27,2012-10-27,2012-03-27,2012-02-27,2012-04-20,2012-04-13,0,0,0,0,0,0,0,0,4,2,17,2,1,1,1,2005-09-07,USER_X ,2012-11-27 00:16:56,USER_X
sales内容:
kylin_sales.trans_id,kylin_sales.part_dt,kylin_sales.lstg_format_name,kylin_sales.leaf_categ_id,kylin_sales.lstg_site_id,kylin_sales.slr_segment_cd,kylin_sales.price,kylin_sales.item_count,kylin_sales.seller_id,kylin_sales.buyer_id,kylin_sales.ops_user_id,kylin_sales.ops_region
0,2012-12-14,Others,88750,0,11,36.2828,4,10000349,10002313,ANALYST,Beijing
1,2012-08-28,Others,175750,0,13,23.8563,20,10000927,10004376,ANALYST,Beijing
2,2012-02-16,ABIN,148324,15,13,88.3418,18,10000005,10006710,ADMIN,Shanghai
3,2013-10-19,FP-non GTC,37831,0,13,47.3015,3,10000209,10003717,ANALYST,Beijing
4,2012-10-22,Others,140746,100,11,83.454,16,10000154,10006076,ADMIN,Shanghai
导入成功后,表的结构信息会以树状的形式显示在页面的左侧,可
以单击展开或收缩.
同时,Kylin会在后台触发一个MapReduce任务,计算此表每个列的
基数。通常稍过几分钟之后再刷新页面,就会看到显示出来的基数信息.
创建数据模型
有了表信息之后,就可以开始创建数据模型(Data Model)了。数据模
型是Cube的基础,它主要用于描述一个星形模型。有了数据模型以后,定
义Cube的时候就可以直接从此模型定义的表和列中进行选择了,省去重
复指定连接(join)条件的步骤。基于一个数据模型还可以创建多个Cube,
以方便减少用户的重复性工作。
在Kylin界面的“Models”页面中,单击“New”→“New Model”,开始创
建数据模型。
- (Model info) 给模型输入名称.
- (Data Model)选择一个事实表(fact table)必需.
添加维度表(Add Lookup table)(可选),
添加维度表的时候,需要选择连接的类型:是Inner还是Left,然后选
择连接的主键和外键,这里也支持多主键.
- left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 inner join(等值连接)
- 只返回两个表中联结字段相等的行
点击 New Join Condition 按钮,左边选择事实表的外键,右边选择 lookup 表的主键。如果有多于一个 join 列重复执行。
- (Dimensions)选择会用作维度的列.这里只是选择一个范围,不代表这些列将来一定要用作Cube的维度. 你可以把所有可能会用到的列都选进来,后续创建Cube的时候,将只能从这些列中进行选择。
选择维度列时,维度可以来自事实表或维度表,如图所示。
- (Measures)度量的列。这里只是选择一个范围,不代表这些列将来一定要用作Cube的度量,你可以把所有可能会用到的列都选进来,后续创建Cube的时候,将只能从这些列中进行选择。
选择度量列时,度量只能来自事实表,如图所示。
- 最后一步,是为模型补充分割时间列信息和过滤条件。
如果此模型中的事实表记录是按时间增长的,那么可以指定一个日期/时间列作为
模型的分割时间列,从而可以让Cube按此列做增量构建,关于增量构建的具体内容后面学习。
过滤(Filter)条件是指,如果想把一些记录忽略掉,那么这里可以设置一个过滤条件。Kylin在向Hive请求源数据的时候,会带上此过滤条件。
语法与sql语法相似.
最后,单击“Save”保存此数据模型,随后它将出现在“Models”的列表
中。
创建cube
接下来开始Cube的创建;单击“New”,选择“New Cube”,会开启一个
包含若干步骤的向导。
1.(Cube Info)选择要使用的数据模型,并为此Cube输入一个唯一的名称
(必需的)和描述(可选的)(如图2-9所示);这里还可以输入一个邮件通知
列表,用于在构建完成或出错时收到通知。
2. (Dimensions)点击 Add Dimension添加维度,在弹窗中显示的事实表和 lookup 表里勾选输入需要的列。Lookup 表的列有2个选项:“Normal” 和 “Derived”(默认)。“Normal” 添加一个普通独立的维度列,“Derived” 添加一个 derived 维度,derived 维度不会计算入 cube,将由事实表的外键推算出。
3. (Measures)点击 +Measure 按钮添加一个新的度量。
4. (Refresh Setting)更新设置
这一步骤是为增量构建 cube 而设计的。
Auto Merge Thresholds: 自动合并小的 segments 到中等甚至更大的 segment。如果不想自动合并,删除默认2个选项。
Volatile Range: 默认为0,会自动合并所有可能的 cube segments,或者用 ‘Auto Merge’ 将不会合并最新的 [Volatile Range] 天的 cube segments。
Retention Threshold: 只会保存 cube 过去几天的 segment,旧的 segment 将会自动从头部删除;0表示不启用这个功能。
Partition Start Date: cube 的开始日期.
5. (Advanced Setting)高级设置
(这里没有太弄懂但直接跳过下一步也可以,那就下次再研究)
Aggregation Groups: Cube 中的维度可以划分到多个聚合组中。默认 kylin 会把所有维度放在一个聚合组,当维度较多时,产生的组合数可能是巨大的,会造成 Cube 爆炸;如果你很好的了解你的查询模式,那么你可以创建多个聚合组。在每个聚合组内,使用 “Mandatory Dimensions”, “Hierarchy Dimensions” 和 “Joint Dimensions” 来进一步优化维度组合。
Mandatory Dimensions: 必要维度,用于总是出现的维度。例如,如果你的查询中总是会带有 “ORDER_DATE” 做为 group by 或 过滤条件, 那么它可以被声明为必要维度。这样一来,所有不含此维度的 cuboid 就可以被跳过计算。
Hierarchy Dimensions: 层级维度,例如 “国家” -> “省” -> “市” 是一个层级;不符合此层级关系的 cuboid 可以被跳过计算,例如 [“省”], [“市”]. 定义层级维度时,将父级别维度放在子维度的左边。
Joint Dimensions:联合维度,有些维度往往一起出现,或者它们的基数非常接近(有1:1映射关系)。例如 “user_id” 和 “email”。把多个维度定义为组合关系后,所有不符合此关系的 cuboids 会被跳过计算。
Rowkeys: 是由维度编码值组成。”Dictionary” (字典)是默认的编码方式; 字典只能处理中低基数(少于一千万)的维度;如果维度基数很高(如大于1千万), 选择 “false” 然后为维度输入合适的长度,通常是那列的最大长度值; 如果超过最大值,会被截断。请注意,如果没有字典编码,cube 的大小可能会非常大。
你可以拖拽维度列去调整其在 rowkey 中位置; 位于rowkey前面的列,将可以用来大幅缩小查询的范围。通常建议将 mandantory 维度放在开头, 然后是在过滤 ( where 条件)中起到很大作用的维度;如果多个列都会被用于过滤,将高基数的维度(如 user_id)放在低基数的维度(如 age)的前面。
Mandatory Cuboids: 维度组合白名单。确保你想要构建的 cuboid 能被构建。
Cube Engine: cube 构建引擎。有两种:MapReduce 和 Spark。如果你的 cube 只有简单度量(SUM, MIN, MAX),建议使用 Spark。如果 cube 中有复杂类型度量(COUNT DISTINCT, TOP_N),建议使用 MapReduce。
Advanced Dictionaries: “Global Dictionary” 是用于精确计算 COUNT DISTINCT 的字典, 它会将一个非 integer的值转成 integer,以便于 bitmap 进行去重。如果你要计算 COUNT DISTINCT 的列本身已经是 integer 类型,那么不需要定义 Global Dictionary。 Global Dictionary 会被所有 segment 共享,因此支持在跨 segments 之间做上卷去重操作。请注意,Global Dictionary 随着数据的加载,可能会不断变大。
“Segment Dictionary” 是另一个用于精确计算 COUNT DISTINCT 的字典,与 Global Dictionary 不同的是,它是基于一个 segment 的值构建的,因此不支持跨 segments 的汇总计算。如果你的 cube 不是分区的或者能保证你的所有 SQL 按照 partition_column 进行 group by, 那么你应该使用 “Segment Dictionary” 而不是 “Global Dictionary”,这样可以避免单个字典过大的问题。
请注意:”Global Dictionary” 和 “Segment Dictionary” 都是单向编码的字典,仅用于 COUNT DISTINCT 计算(将非 integer 类型转成 integer 用于 bitmap计算),他们不支持解码,因此不能为普通维度编码。
Advanced Snapshot Table: 为全局 lookup 表而设计,提供不同的存储类型。
Advanced ColumnFamily: 如果有超过一个的COUNT DISTINCT 或 TopN 度量, 你可以将它们放在更多列簇中,以优化与HBase 的I/O。
6. (Configuration Overwrites)重写配置
Kylin 允许在 Cube 级别覆盖部分 kylin.properties 中的配置,你可以在这里定义覆盖的属性。如果你没有要配置的,点击 Next 按钮。
7. (Overview)你可以概览你的 cube 并返回之前的步骤进行修改。点击 Save 按钮完成 cube 创建。
创建好的Cube会显示在“Cubes”列表中,如要对Cube的定义进行修
改,只需单击“Edit”按钮就可以进行修改。也可以展开此Cube行以查看更
多的信息,如JSON格式的元数据、访问权限、通知列表等。
点击 Actions > Build 选择合适的时间,进行build cube
点击Monitor即可看到job的执行情况.
当job执行成功,进入Insight ,在New Query中添加sql语句,如:
select *from KYLIN_SALES ;
运行结果:
上一篇: 第6章_递归
下一篇: 定时任务的并发_03