OLAP 玩转KYLIN 步十四 为什么使用Hive View

本篇内容大部分参考自文章《Kylin实践之使用Hive视图

为什么需要使用视图

Kylin在使用的过程中使用hive作为cube的输入,但是有些情况下,hive中的表定义和数据并不能满足分析的需求,例如有些列的值需要进行处理,有些列的类型不满足需求,甚至有时候在创建hive表时为了图方便,hive中的所有列都被定义成了string,因此很多情况下在使用Kylin之前需要对hive上的数据格式进行适当的修剪,但是使用alter table的方式修改hive原始的schema信息未免会对其它依赖hive的组件有所影响(例如可能导致数据导入失败),于是不得不另辟蹊径,而此时使用hive的视图就是一个非常好的方案。
当然,除了Hive数据源本身schema的限制之外,Kylin对于hive的使用还有一定的限制,这也间接的导致我们需要使用视图,比如kylin只支持星状模型。

如何使用视图

Hive目前只支持逻辑视图,而我们需要的仅仅是对Hive原始的schema信息的修改,而并非希望通过物化视图优化查询速度,因此目前Hive对视图的支持可以满足Kylin的需要。下面根据不同的场景分别介绍一下如何创建视图作为Kylin的输入源。

1、分表的情况:两个表具有相同的结构,但是保存不同的数据,例如一个表保存Android端的访问数据,一个访问IOS端的数据,可以通过view搞定。
例如在我们的环境中有一个用户有两张表product_android和product_ios,这两个表具有相同的表结构,用户需要将平台(android或者IOS)作为一个维度进行分析,因此我们为其创建了这样的view:
create view product_cube as
select userid, eventid, label, day, ‘android’ as platform from product_android WHERE category=’a’
UNION ALL
select userid, eventid, label, day, ‘ios’ as platform from product_ios WHERE category=’a’;
这样可以将product_cube作为事实表创建cube而platform作为其中的一个维度

2、自定义函数,Apache Calcite是支持自定义函数的,但是Kylin支持自定义函数的代价比较大,因此如果需要使用自定义函数,可以在Hive中创建view得到每一个希望的字段。

3、雪花状模型的支持,目前kylin仅支持星状模型,而通过创建view可以轻易地把雪花状模型转换成星型模型,甚至生成一个大宽表。

4、频繁修改表字段名,Kylin直接使用hive中的字段名作为元数据,如果频繁修改事实表或者维度表的字段名会导致元数据错误,因此通过view增加一层映射是比较好的方法,这样可以使得原生的hive表的字段名对Kylin的cube透明,此后再需要修改字段名的时候不会对cube有所影响,只需要修改view的定义。

5、hive表中类型修改,有时候在创建hive表时为了方便,把所有的表字段都定义成string,但是calcite中对类型的限制比较严格,例如extract函数只能对date之类的类型进行操作,所以有时在定义cube之前需要对hive表中的字段进行转换,创建view就是一个很好的办法。

6、复合数据类型处理,由于hive中可以定义复杂的数据类型,例如map、struct,而Kylin需要看到的是一个扁平的表结构,所以需要将复杂类型字段进行拆分出维度和度量。

实践中,cube的事实表通过view创建,这样增加了一层映射,可以减小cube对原始表的依赖,提高灵活性。

没有更多推荐了,返回首页