【Kylin实战】Hive复杂数据类型与视图
1. 引言
在分析广告日志时,会有这样的多维分析需求:
- 曝光、点击用户分别有多少?
- 标签能覆盖多少广告用户?
- 各个标签(标注)类别能覆盖的曝光、点击在各个DSP上所覆盖的用户数
- ……
广告数据与标签数据join之后,存储orc file的schema如下:
create external table default.ad_tag
(
uid string
,dsp string
,view string
,click string
,tags array<struct<tag:string,label:string,src:string>>
)
partitioned by (day_time date)
stored as orc
location '/<path>/<to>';
用户可能会有多个标签,因此采用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也提供视图,但视图不能被物化。在Hive中创建视图时,只是将该视图的元信息写进metastore;只有在执行引用视图语句时,才会触发其select子句的执行。虽然Hive不能物化视图,但提供了其等价解决方案——由一张表生成另外一张表:
create table
as select ...
这种类物化的方式,在创建表时会触发select子句的执行,存在缺点:对于partition增量更新表,做不到view的partition与之同时更新。所以,对于我们的场景不太适用。
3. inline
如何在创建视图时,将复杂数据类型平铺开来呢?Hive内置UDTF做这种平铺化(flatten)操作,但是UDTF并不能配合select用,而在lateral view子句中使用;比如,explode平铺array:
select pageid, adid
from 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提供PartitionedView,为view添加partition。完整地创建视图的命令如下:
create view if not exists ad_tag_view
partitioned on (day_time)
as
select uid, dsp, view, click, tag, label, src, day_time
from ad_tag lateral view inline(tags) tags_table;
经测试,在Kylin中读取view没问题,基础表的增量更新,也会同步地反映到view中。至此,Kylin导入复杂数据类型的Hive表问题已解决。此外,这篇文章《Kylin实践之使用Hive视图》介绍几种不同场景下使用视图的例子。
【Kylin实战】Hive复杂数据类型与视图的更多相关文章
- 大数据时代的技术hive:hive的数据类型和数据模型
在上篇文章里,我列举了一个简单的hive操作实例,创建了一张表test,并且向这张表加载了数据,这些操作和关系数据库操作类似,我们常把hive和关系数据库进行比较,也正是因为hive很多知识点和关系数 ...
- Hive 5、Hive 的数据类型 和 DDL Data Definition Language)
官方帮助文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL Hive的数据类型 -- 扩展数据类型data_t ...
- hadoop笔记之Hive的数据存储(视图)
Hive的数据存储(视图) Hive的数据存储(视图) 视图(view) 视图是一种虚表,是一个逻辑概念:可以跨越多张表 既然视图是一种虚表,那么也就是说用操作表的方式也可以操作视图 但是视图是建立在 ...
- hadoop笔记之Hive的数据类型
Hive的数据类型 Hive的数据类型 前面说过,Hive是一个数据仓库,相当于一个数据库.既然是数据库,那么就必须能创建表,既然有表,那么当中就有列,列中就有对应的类型 总的来讲,hive的数据类型 ...
- Hive之数据类型
Hive之数据类型 (本文是基于多篇文章根据个人理解进行的整合,参考的文章见末尾的整理) 数据类型 Hive支持两种数据类型,一类叫原子数据类型,一类叫复杂数据类型.原子数据类型包括数值型.布尔型 ...
- Hive 复杂数据类型的使用
Hive复杂数据类型 1.Array数据类型的使用 1.1.创建数据库表,以array作为数据类型 hive (hive_demo1)> create table stu_test(name a ...
- kylin实战系列(一)
kylin实战系列(一) 把之前kylin的实践小结一下,以备以后查看.
- kylin Retrieving hive dependency...
由于公司环境配置hive默认连接hiveserver2 ,不管hive cli 还是beeline cli都默认使用beeline cli,连接hive需要输入账号密码; 启动kylin 时会Retr ...
- 《Hive编程指南》读书笔记 | 一文看懂Hive的数据类型和文件格式
Hive支持关系型数据库中的大多数基本数据类型,同时也支持关系型数据库中很少出现的3种集合数据类型. 和大多数数据库相比,Hive具有一个独特的功能,那就是其对于数据在文件中的编码方式具有非常大的灵活 ...
随机推荐
- C++基础_总结
(1)多态性都有哪些?(静态和动态,然后分别叙述了一下虚函数和函数重载) 多态分为两种:静态和动态.静态主要包括函数重载和模板:动态主要是依靠虚函数实现的. 静态联编:重载函数不加virtual关键字 ...
- 非常棒的Android对话框效果
FlycoDialog_Master http://www.see-source.com/androidwidget/detail.html?wid=488 带有各种动画效果的弹出对话框控件.你也可以 ...
- 第一章-第十三题(该游戏团队, 有很好的软件,但是商业模式和其他软件之外的因素有没有考虑到?)--By梁旭晖
这款软件无疑是一个好软件,软件的开发者是有相当水平的,可以说是优秀的软件编写人员,但是也只是优秀的软件人员,术业有专攻,他们在其他方面我觉得是有很大的欠缺的. 我觉得,他们并没有抓住消费者的心理,首先 ...
- Weblogic反序列化漏洞补丁更新解决方案
Weblogic反序列化漏洞的解决方案基于网上给的方案有两种: 第一种方案如下 使用SerialKiller替换进行序列化操作的ObjectInputStream类; 在不影响业务的情况下,临时删除掉 ...
- Java实现文件在某个目录的检索
package com.filetest; import java.io.File; import java.util.Date; import java.util.Scanner; public c ...
- myeclipse中导入js报如下错误Syntax error on token "Invalid Regular Expression Options", no accurate correc
今天在使用bootstrap的时候引入的js文件出现错误Syntax error on token "Invalid Regular Expression Options", no ...
- LA
grmon -altjtag -u 公式rand()%(b-a),是求范围随机数的计算公式,%是做求余运算,正整数对n求余的范围肯定是在0~n-1之间,也就是rand()%(b-a)的范围是0~b-a ...
- Javascript本质第二篇:执行上下文
在上一篇文章<Javascript本质第一篇:核心概念>中,对Javascript执行上下文做了解释,但是这些都是基于Javascript标准中对执行上下文的定义,也就是说理论上的东西,本 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (27) ------ 第五章 加载实体和导航属性之关联实体过滤、排序、执行聚合操作
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-9 关联实体过滤和排序 问题 你有一实体的实例,你想加载应用了过滤和排序的相关 ...
- VB6.0中,DTPicker日期、时间控件不允许为空时,采用文本框与日期、时间控件相互替换赋值(解决方案)
VB6.0中,日期.时间控件不允许为空时,采用文本框与日期.时间控件相互替换赋值,或许是一个不错的选择. 实现效果如下图: 文本框txtStopTime1 时间框DTStopTime1(DTPicke ...