Hive lateral view 的用法
lateral view 的语法格式
lateral view:
LATERAL VIEW udtf (expression) tableAlias AS coluumAlias ( ',' , columnAlias)*
用法描述
lateral view 要与UDTF函数一起使用,比如 explode() 函数。这里的UDTF函数是指用户自定义的表生成函数(英文全称:user defined table-generating functions),它可以接受一行输入然后产生0行或多行输出。lateral view 首先将utdf函数应用到每一行上,这时每一行经utdf处理后得到多行输出,这些输出将会组建成一张虚拟表,然后这张虚拟表会跟当前表进行join操作,join完成之后会得出一张结果虚拟表,这张结果表里就有了utdf生成的列,当然原表的列除了utdf消耗的列之外肯定也在都里面。
示例说明1 — list 类型的列
假设 pageAds 表有两列,第 1 列是页面id,第 2 列是页面里的广告id组成的数组。
create table pageAds (page_id string, adid_list Array<int>);
里面有两行数据。
insert into pageAds values ('front_page', array(1,2,3)), ('contact_page', array(3,4,5));
这两行数据的意思是:front_page页有三条广告,id分别是1,2,3。contact_page页也有三条广告,id分别是3,4,5。
现在需要解决的问题是:在所有页面中统计每条广告出现的次数,输出广告id和该广告出现的总次数。
inner join
使用 lateral view 和 explore() 函数将 adid_list 列的 list 拆分,sql代码如下:
SELECT page_id, ad_id
FROM pageAds LATERAL VIEW explode(adid_list) adTable AS ad_id;
可以得到以下结果:
page_id | ad_id |
---|---|
front_page | 1 |
front_page | 2 |
front_page | 3 |
contact_page | 3 |
contact_page | 4 |
contact_page | 5 |
然后我们再使用 count/group by 语句统计出每个adid出现的次数:
SELECT ad_id, count(1) cnt
FROM pageAds LATERAL VIEW explode(adid_list) adTable AS ad_id
GROUP BY ad_id;
得到最终结果:
ad_id | cnt |
---|---|
1 | 1 |
2 | 1 |
3 | 2 |
4 | 1 |
5 | 1 |
outer lateral view
later view 前面还可以加上一个 outer 关键字,这是为了避免 当udtf 没有得到任何结果时最终虚拟结果表里丢失原数据行的问题。具体来将,由于later view 的工作原理是将原表与 udtf 产生的虚拟表做 inner join 操作,所以如果 udtf 不产生任何结果时,那么对应原表的那一行也会在 inner join 操作后消失。outer关键字就是来解决这个问题的,加上这个关键字之后执行的就是 outer join 操作了,因此原表数据会被完全保留下来。
例如,上面的 pageAds 表中再插入一行数据:
insert into pageAds values ('end_page', collect_set(CAST(NULL AS INT)));
pageAds 的内容如下:
hive> select * from pageAds;
OK
pageads.page_id pageads.adid_list
front_page [1,2,3]
contact_page [3,4,5]
end_page []
那么执行 lateral view 的sql:
SELECT page_id, ad_id
FROM pageAds LATERAL VIEW explode(adid_list) adTable AS ad_id;
得到的结果将会是:
page_id (string) adid (int)
"front_page" 1
"front_page" 2
"front_page" 3
"contact_page" 3
"contact_page" 4
"contact_page" 5
可以看到,end_page 那一行消失了,因为它没有在 inner join 中关联到任何数据。因此如果想保留原表全部数据的话,就需要加上outer关键字:
SELECT page_id, ad_id
FROM pageAds OUTER LATERAL VIEW explode(adid_list) adTable AS ad_id;
得到如下结果
page_id (string) adid (int)
"front_page" 1
"front_page" 2
"front_page" 3
"contact_page" 3
"contact_page" 4
"contact_page" 5
“end_page” <NULL>
示例说明2 — 普通类型
dept_benifi 是部门利润表。
drop table if exists dept_benifit;
create table dept_benifit (DEPT_NO string comment'部门编号',DEPT_TREE string comment'部门层级树',BENIFIT int comment'利润(万元)'
);
插入记录
insert into table dept_benifit values
('101','A.A1.101',50),
('102','A.A1.102',20),
('201','A.A2.201',80);
转成多行
利用 lateral view 和 explode 函数将 DEPT_TREE(部门层级树) 列按照“.”分割转成多行,通过结果可以看到,lateral view函数将 “部门层级树” 字段炸开进行了扩展,每个部门(DEPT_NO)都有与之对应的利润(BENIFIT),从三行数据直接变成9行数据
select tmp_dept_no as DEPT_NO, BENIFIT
from dept_benifit
LATERAL VIEW explode (split(DEPT_TREE, '\\.')) tmp as tmp_dept_no;
结果如下:
dept_no benifit
A 50
A1 50
101 50
A 20
A1 20
102 20
A 80
A2 80
201 80
对部门利润进行向上汇总求和,可以看到每个部门的总利润。
select tmp_dept_no as DEPT_NO, sum(BENIFIT) as BENIFIT
from dept_benifit
LATERAL VIEW explode (split(DEPT_TREE, '\\.')) tmp as tmp_dept_no
group by tmp_dept_no;
结果如下:
dept_no benifit
101 50
102 20
201 80
A 150
A1 70
A2 80
Hive lateral view 的用法相关推荐
- Hive Lateral View、视图、索引
一.Hive Lateral View 1.Lateral View用于和UDTF函数(explode.split)结合来使用. 2.首先通过UDTF函数拆分成多行,再将多行结果组合成一个支持别名的虚 ...
- hive sql之lateral view explode用法
这篇文章讲的特别好 lateral view explode相当于笛卡尔乘积: 表1的每一行与表二的每一行组合,作为新的一行
- hive lateral view explode列拆分与行转列用法
在日常工作中,我们在处理数据时,会遇到某个列存在多个数据的情况,如果想拿到这个列里面每个数据进行后续处理的话,这种情况下有两种处理方式: 第一种:如果这个列多个数据是固定数目,可以使用split切分 ...
- Hive Lateral View + explode 详解
hive中的函数分为3类,UDF函数.UDAF函数.UDTF函数 UDF:一进一出 UDAF:聚集函数,多进一出,类似于:count/max/min UDTF:一进多出,如explore().pose ...
- 【SQL】LATERAL VIEW 的用法
通过SQL实现列转行 order_sn user_id coupon_sn A 1 券A1,券A2,券A3 B 2 券B1 C 3 (NULL) D 4 券D1 SELECT table_a.orde ...
- [hive]lateral view炸开两层
一. 说明 1.lateral view 侧视图lateral view要和explode/split等UDTF函数一起使用,他可以在函数拆分成多行的基础上,将表其他字段按照拆分结果进行聚合. 2.用 ...
- Hive Lateral View explode字段值为空时,导致数据异常丢失解决方案
1.问题描述 日常工作中,我们经常会用Lateral View 结合explode把非结构化数据转化成结构化数据,但是该方法对应explode的内容是有非null限制的,否则就有可能造成数据缺失. 现 ...
- Hive Lateral View
目录 Hive explode介绍: Hive posexplode介绍: Lateral View介绍: 使用多个Lateral View: outer关键字: Hive explode介绍: 它会 ...
- Hive Lateral View使用指南
1. 语法 lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)* fromCl ...
最新文章
- 大学python和vb哪个简单-python和vb哪个简单
- c++中利用sizeof运算符计算结构体大小问题探讨
- javascript 模块化编程----模块的写法
- 在Ubuntu上安装RealPlayer的方法
- 计算机考研分数2019,2019考研分数线和国家线有什么关系
- c#操作ecxel的一些资源(downmoon搜集)
- 问题解决 xenapp6/6.5发布资源管理器explorer应用不能打开 一闪而过
- 准备入手Macbook Pro
- 【干货】前端工程与性能优化
- windows,linux桌面系统管理
- win10系统怎么删除远程桌面连接记录
- java钢铁之心,洛克人 Dash 2 EPISODE 2(第二部) - 巨大的遗产[日]下载
- 最全的厚黑学,教你怎样混社会(人生格言) 作者 李宗吾
- java中getTime()
- readlink 获取进程的绝对路径
- 相比高人气的 Rust、Go,为何 Java、C 在工具层面进展缓慢?
- Spring Kafka实战(3)—message listener创建方式探讨
- 仙居机器人_仙居三名高中生拿下国际机器人大赛总决赛冠军
- 华为v8原生态android,安卓原生系统的手机有哪些_2019安卓原生系统手机推荐_飞翔教程...
- Appium日记20161031 徐慧迅
热门文章
- [渝粤教育] 中南财经政法大学 生活中的管理会计 参考 资料
- 再日阿里云,鸡贼第二弹!以身试法,希望你不要中招了!!!
- ESXI6.7 windows虚拟机 取消Vmware Tools分辨率自适应/固定分辨率
- 文档/图片/视屏/音频在线格式转换工具(实用,免费)
- 网络安全内外忧患,发现儿童平板电脑中含有漏洞,容易遭遇黑客.
- 二维空间计算几何源码(一)
- 全网最全Unity面试题加强版之八《图形学相关》
- python打印出各种三角形
- c++实现split函数
- Apache软件服务|功能详解