Apache Kylin权威指南2.2 在Hive中准备数据-阿里云开发者社区

开发者社区> 华章出版社> 正文

Apache Kylin权威指南2.2 在Hive中准备数据

简介:

2.2 在Hive中准备数据


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张表一起构成了整个星形模型。

版权声明:如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:developerteam@list.alibaba-inc.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接