<b>2.2 在hive中准备数据</b>
<b></b>
2.1节介绍了kylin中的常见概念。本节将介绍准备hive数据的一些注意事项。需要被分析的数据必须先保存为hive表的形式,然后kylin才能从hive中导入数据,创建cube。
apache hive是一个基于hadoop的数据仓库工具,最初由facebook开发并贡献到apache软件基金会。hive可以将结构化的数据文件映射为数据库表,并可以将sql语句转换为mapreduce或tez任务进行运行,从而让用户以类sql(hiveql,也称hql)的方式管理和查询hadoop上的海量数据。
此外,hive还提供了多种方式(如命令行、api和web服务等)可供第三方方便地获取和使用元数据并进行查询。今天,hive已经成为hadoop数据仓库的首选,是hadoop上不可或缺的一个重要组件,很多项目都已兼容或集成了hive。基于此情况,kylin选择hive作为原始数据的主要来源。
在hive中准备待分析的数据是使用kylin的前提;将数据导入到hive表中的方法有很多,用户管理数据的技术和工具也各式各样,因此具体步骤不在本书的讨论范围之内。如有需要可以参考hive的使用文档。这里将着重阐述需要注意的几个事项。
2.2.1 星形模型
数据挖掘有几种常见的多维数据模型,如星形模型(star schema)、雪花模型(snowf?lake schema)、事实星座模型(fact constellation)等。
星形模型中有一张事实表,以及零个或多个维度表;事实表与维度表通过主键外键相关联,维度表之间没有关联,就像很多星星围绕在一个恒星周围,故取名为星形模型。
如果将星形模型中某些维度的表再做规范,抽取成更细的维度表,然后让维度表之间也进行关联,那么这种模型称为雪花模型。
星座模型是更复杂的模型,其中包含了多个事实表,而维度表是公用的,可以共享。
不过,kylin只支持星形模型的数据集,这是基于以下考虑。
星形模型是最简单,也是最常用的模型。
由于星形模型只有一张大表,因此它相比于其他模型更适合于大数据处理。
其他模型可以通过一定的转换,变为星形模型。
2.2.2 维度表的设计
除了数据模型以外,kylin还对维度表有一定的要求,具体要求如下。
1)要具有数据一致性,主键值必须是唯一的;kylin会进行检查,如果有两行的主键值相同则会报错。
2)维度表越小越好,因为kylin会将维度表加载到内存中供查询;过大的表不适合作为维度表,默认的阈值是300mb。
3)改变频率低,kylin会在每次构建中试图重用维度表的快照,如果维度表经常改变的话,重用就会失效,这就会导致要经常对维度表创建快照。
4)维度表最好不要是hive视图(view),虽然在kylin 1.5.3中加入了对维度表是视图这种情况的支持,但每次都需要将视图进行物化,从而导致额外的时间开销。
2.2.3 hive表分区
hive表支持多分区(partition)。简单地说,一个分区就是一个文件目录,存储了特定的数据文件。当有新的数据生成的时候,可以将数据加载到指定的分区,读取数据的时候也可以指定分区。对于sql查询,如果查询中指定了分区列的属性条件,则hive会智能地选择特定分区(也就是目录),从而避免全量数据的扫描,减少读写操作对集群的压力。
下面列举的一组sql演示了如何使用分区:
hive> create table invites (id int, name string) partitioned by (ds string) row format delimited fields terminated by 't' stored as textfile;?
hive> load data local inpath '/user/hadoop/data.txt' overwrite into table invites partition (ds='2016-08-16');?
hive> select * from invites where ds ='2016-08-16';
kylin支持增量的cube构建,通常是按时间属性来增量地从hive表中抽取数据。如果hive表正好是按此时间属性做分区的话,那么就可以利用到hive分区的好处,每次在hive构建的时候都可以直接跳过不相干日期的数据,节省cube构建的时间。这样的列在kylin里也称为分割时间列(partition time column),通常它应该也是hive表的分区列。
2.2.4 了解维度的基数
维度的基数(cardinality)指的是该维度在数据集中出现的不同值的个数;例如“国家”是一个维度,如果有200个不同的值,那么此维度的基数就是200。通常一个维度的基数会从几十到几万个不等,个别维度如“用户id”的基数会超过百万甚至千万。基数超过一百万的维度通常被称为超高基数维度(ultra high cardinality,uhc),需要引起设计者的注意。
cube中所有维度的基数都可以体现出cube的复杂度,如果一个cube中有好几个超高基数维度,那么这个cube膨胀的概率就会很高。在创建cube前需要对所有维度的基数做一个了解,这样就可以帮助设计合理的cube。计算基数有多种途径,最简单的方法就是让hive执行一个count distinct的sql查询;kylin也提供了计算基数的方法,在2.3.1节中会进行介绍。
2.2.5 sample data
如果需要一些简单数据来快速体验apache kylin,也可以使用apache kylin自带的sample data。运行“${kylin_home}/bin/sample.sh”来导入sample data,然后就能按照下面的流程继续创建模型和cube。
具体请执行下面命令,将sample data导入hive数据库。
cd ${kylin_home}
bin/sample.sh
sample data测试的样例数据集总共仅1mb左右,共计3张表,其中事实表有10000条数据。因为数据规模较小,有利于在虚拟机中进行快速实践和操作。数据集是一个规范的星形模型结构,它总共包含了3个数据表:
kylin_sales是事实表,保存了销售订单的明细信息。各列分别保存着卖家、商品分类、订单金额、商品数量等信息,每一行对应着一笔交易订单。
kylin_category_groupings是维表,保存了商品分类的详细介绍,例如商品分类名称等。
kylin_cal_dt也是维表,保存了时间的扩展信息。如单个日期所在的年始、月始、周始、年份、月份等。
这3张表一起构成了整个星形模型。