Apache Kylin高级部分之使用Hive视图

本章节我们将介绍为什么须要在Kylin创建Cube过程中使用Hive视图。而假设使用Hive视图。能够带来什么优点。解决什么样的问题。以及须要学会怎样使用视图。使用视图有什么限制等等。

 

1.      为什么须要使用视图

Kylin创建Cube的过程中使用Hive的表数据作为输入源。可是有些情况下,Hive中的表定义和数据并不能满足分析的需求。比如有些列的值须要进行处理,有些列的类型不满足需求,甚至有时候我们在创建Hive表时为了方便快捷,会将Hive表的全部列的字段类型都定义为string,因此非常多情况下在使用Kylin之前须要对Hive上的数据格式等问题进行适当的处理。

 

可是假设在Hive中通过改动原表来解决上面的问题,比方使用alter table的方式改动原始表的Schema信息未免会对其他依赖Hive的组件有所影响(比如可能导致通过Sqoop等方式导入数据失败)。并且也有可能导致之前的作业无法正常执行。于是我们须要考虑在不改变原表的情况下解决问题,因此我们想到的方案是使用Hive的视图。

 

当然,除了Hive数据源本身Schema等限制之外,Kylin对于Hive的使用另一定的限制,这也间接的导致我们须要使用视图:

A.     同一个项目下使用同样表(可能依据不同的filter条件过滤。或者设置了不同的维度等)创建了不同的Cube,会导致查询的时候定位到错误的Cube等异常问题。

B.     仅仅支持星型模型

我们的来源表可能包括多张事实表和多张维表,那么就须要将多张事实表整合成一张大的宽表。

 

2.      怎样使用视图

Hive眼下仅仅支持逻辑视图,而我们须要的仅仅是对Hive原始的Schema信息的改动,而并不是希望通过物化视图优化查询速度。因此眼下Hive对视图的支持能够满足Kylin的须要。

 

以下依据不同的场景分别介绍一下怎样创建视图作为Kylin的输入源:

A.     分表的情况

两个表具有同样的结构。可是保存不同的数据。比如一个表保存Android端的訪问数据,一个訪问iOS端的数据。那么就能够通过Hive的view解决。

 

比如有一个用户有两张表product_android和product_ios。这两个表具有同样的表结构,用户须要将平台(Android或者IOS)作为一个维度进行分析。因此我们为其创建了这种view:

create view palearn_cube as
select userid, eventid, label, day, 'android' as platformfrom palearn_android WHERE category='gc001'
UNION ALL
select userid, eventid, label, day, 'ios' as platform frompalearn_ios WHERE category='gc001';

这样能够将palearn_cube作为事实表来创建Cube,当中而platform作为当中的一个维度

 

B.     自己定义函数

Kylin中使用Apache Calcite作为SQL的查询引擎,可是Kylin支持的自己定义函数代价比較大。因此假设须要使用自己定义函数,那么能够在Hive中创建视图来对字段进行处理。

C.     雪花模型的支持

眼下Kylin仅支持星型模型,而通过在Hive中创建视图,我们能够非常easy地把雪花模型转换为星型模型,甚至生成一个大的宽表。

 

D.     频繁改动表字段名

Kylin直接使用Hive中的字段名作为元数据。假设频繁改动事实表或者维度表的字段名会导致元数据错误(https://issues.apache.org/jira/browse/KYLIN-1173)。因此通过视图添加一层映射是比較好的方法。这样能够使得原生的Hive表的字段名对Kylin的Cube透明,此后再须要改动字段名的时候不会对Cube有所影响,仅仅须要改动view的定义。

 

E.      UHC维度

当一个维度的cardinality比較大时可能会出现的问题比較多。首先可能导致Extract Fact Table Distinct Columns这一步时导致reducer出现OOM;其次在创建维度字典树可能会导致维度字典树太大占领大量的内存;另外会导致cube的构建速度缓慢。占用大量的存储空间。此时就须要思考一下这种UHC维度是否是必须的。能否够提取出部分信息减小维度。比如timestamp维度,能否够精确到5分钟,具体地址的维度,能否够精确到县、镇。这样能够大大减小维度数。并且更具体的信息并没有太大的统计意义。比如url类型的维度,能否够把參数去掉仅仅保留訪问路径。

 

F.      Hive中表字段类型变化

比方我们之前有一个需求计算一个指标的Count Distinct值,尽管这个字段存放的内容为整数值。可是Hive表字段类型为string,Kylin中Count Distinct聚合函数不支持字符类型,因此我们在Hive中创建视图解决问题,即将string类型转换为整数类型。

 

G.     复合数据类型处理

因为Hive中能够定义复杂的数据类型,比如map、struct,而Kylin中无法处理这种类型,所以须要使用视图将复杂类型字段进行拆分出维度和度量。

 

在我们眼下的实践中,有一部分Cube依赖的事实表都是通过view创建的,这样添加了一层映射,能够减小cube对原始表的依赖,提高灵活性。

 

3.      使用视图限制

因为Hive的限制,Hive不能对view使用HCatalog获取数据

(https://issues.apache.org/jira/browse/HIVE-10851),因此当你在Kylin中load一个view的时候,Kylin计算表的cardinality的job无法获取到cardinality的值。这时就要求用户知道每一列的cardinality大致的情况。假设实在不确定能够到Hive里面查询一下。

 

4.      使用视图实战

这里我给朋友们简单演示一下视图的使用,事实上视图在我们项目中还是会常常遇到的。

不知道朋友们还记不记得之前我们创建过三张表(请查看“Apache Kylin进阶部分之多维分析的Cube创建实战”章节):

事实表:kylin_flat_db.web_access_fact_tbl

维表:kylin_flat_db. region_tbl

维表:kylin_flat_db.city_tbl

 

假设您依据本书实战的话。当前Hive的kylin_flat_db数据库以下应该有这三张表。我们如今将在Hive中对这三张表创建视图。依据视图来构建Cube。大概过程例如以下:

步骤一:创建视图

在Hive Cli中执行例如以下SQL:

use kylin_flat_db;
create view v_pvuv as select a.DAYas v_date,
       b.regionname,
       c.cityname,
       hash(a.cookieid) as cookieid,
       a.pv
from web_access_fact_tbl a
join region_tbl b
on a.regionid = b.regionid
join city_tbl c
on a.cityid = c.cityid;

这里对cookieid字段(字符串类型)使用hash函数处理。结果处理为整数类型,我们这样做的目的是为了使用Count Distinct(眼下仅仅支持整数类型)精确去重。

 

注:hash算法的特点是可反复和不可逆的,即针对不同的字符串进行hash处理。结果可能会反复的,所以上面的方法存在一定的问题。在实际项目中我们使用Hive自己定义函数对须要使用Count Distinct精确的字段(整数类型就不必处理了)处理成整数类型。

 

步骤二:创建项目

创建“view_project”project,当然也能够使用不论什么已经存在的project。

 

步骤三:导入数据源

导入kylin_flat_db数据库下刚才创建的视图v_pvuv。

 

步骤四:创建Model

这里我们作为演示,仅仅选了一张视图作为事实表。没有维表。

当中:

维度字段:v_date。regionname,cityname

度量字段:cookieid,pv

分区字段:v_date

 

步骤五:创建Cube

因为朋友们对于怎样创建Cube都非常熟悉了,这里我们简要罗列几步。

 

创建Cube所选的维度例如以下:



创建Cube所选的度量例如以下:

当中我们使用精确的COUNT_DISTINCT函数来计算cookieid字段中值,所以返回类型为bitmap。

 

步骤六:构建Cube

设置构建的结束时间,然后构建Cube。

 

步骤七:查询Cube

查询例如以下SQL:

select v_date,
       regionname,
       cityname,
       count(distinct cookieid)
from V_PVUV
group by v_date,
         regionname,
         cityname;

 

结果为:

 

在我们使用Kylin的过程中。对于上面提到的问题非常多都能够通过Hive的视图进行解决。假设朋友们在Kylin使用过程中遇到一些Kylin自身无法解决的时候。能够尝试一下Hive的视图,或许会给您带来惊喜。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值