博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Kylin实战】Hive复杂数据类型与视图
阅读量:6192 次
发布时间:2019-06-21

本文共 1780 字,大约阅读时间需要 5 分钟。

1. 引言

在分析广告日志时,会有这样的多维分析需求:

  • 曝光、点击用户分别有多少?
  • 标签能覆盖多少广告用户?
  • 各个标签(标注)类别能覆盖的曝光、点击在各个DSP上所覆盖的用户数
  • ……

广告数据与标签数据join之后,存储orc file的schema如下:

create external table default.ad_tag(uid string,dsp string,view string,click string,tags array
>)partitioned by (day_time date)stored as orclocation '/
/
';

用户可能会有多个标签,因此采用array<struct>数据类型来作为用户的标签字段。可是,当用Kylin做多维分析时,会出现问题——Kylin只能导入扁平化的Hive表,简而言之,其不支持Hive的复杂数据类型,如array、struct、map等。为了解决这个问题,我们希望能从这张ad_tag表中抽象出一张扁平化的逻辑表,并且这张逻辑表的partition能跟ad_tag表保持同步更新。

2. 视图

众所周知,在RDBMS中,视图(view)可用来抽象出逻辑表,比如,得到CS系所开设的所有课程及相关教师信息:

create view as    select course, teacher, building    from teaches, teacher_table    where teaches.teacher_id = teacher_table.teacher_id         and teaches.dept_name = 'CS'

在有一些数据库解决方案中提供了物化视图(materialize view),即物理存储视图。同RDBMS一样,也提供视图,但视图不能被物化。在Hive中创建视图时,只是将该视图的元信息写进metastore;只有在执行引用视图语句时,才会触发其select子句的执行。虽然Hive不能物化视图,但提供了其等价解决方案——由一张表生成另外一张表:

create tableas select ...

这种类物化的方式,在创建表时会触发select子句的执行,存在缺点:对于partition增量更新表,做不到view的partition与之同时更新。所以,对于我们的场景不太适用。

3. inline

如何在创建视图时,将复杂数据类型平铺开来呢?Hive内置做这种平铺化(flatten)操作,但是UDTF并不能配合select用,而在子句中使用;比如,explode平铺array:

select pageid, adidfrom pageAds lateral view explode(adid_list) adTable as adid;

inline平铺array<struct>

select *from test_bid lateral view inline(tags) tag_table_1;

4. Partition

数据在增量更新,对应地partition也在变化,创建的视图也应同步partition的变化;并且,Kylin的增量cube是根据hive表的partition进行refresh的。因此,该视图应保持与基础表相同的partition。正好,Hive提供,为view添加partition。完整地创建视图的命令如下:

create view if not exists ad_tag_viewpartitioned on (day_time)asselect uid, dsp, view, click, tag, label, src, day_timefrom ad_tag lateral view inline(tags) tags_table;

经测试,在Kylin中读取view没问题,基础表的增量更新,也会同步地反映到view中。至此,Kylin导入复杂数据类型的Hive表问题已解决。此外,这篇文章《》介绍几种不同场景下使用视图的例子。

转载地址:http://murda.baihongyu.com/

你可能感兴趣的文章
SQL*PLUS命令的使用大全
查看>>
Sql Server2005 Transact-SQL 新兵器学习总结之-DDL触发器
查看>>
C#“多线程线程间操作无效: 从不是创建控件的线程访问它。”,跨线程修改控件属性解决方案...
查看>>
jsp中excel文件的创建与读取
查看>>
Oracle backgroup processes
查看>>
《C++ primer》--第12章
查看>>
KSFramework常见问题:Excel如何进行SVN协作、差异比较?
查看>>
Xen Credit调度算法
查看>>
在.NET中通过Outlook发送Email
查看>>
Wordpress中JQUERY链接平移效果
查看>>
Java文件操作与输入输出流
查看>>
Unity3D中暂停时的动画及粒子效果实现
查看>>
c语言数据类型
查看>>
数据库闭包和候选码求解方法
查看>>
一个分页排序SQL查询结果集不确定的案例
查看>>
数学分析高等代数考研试题荟萃[更新至2017年10月1日]
查看>>
Redis-benchmark测试Redis性能
查看>>
纪念一下博客园积分进入前1000名
查看>>
计算器
查看>>
JDK目录和Java三大平台
查看>>