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 的用法相关推荐

  1. Hive Lateral View、视图、索引

    一.Hive Lateral View 1.Lateral View用于和UDTF函数(explode.split)结合来使用. 2.首先通过UDTF函数拆分成多行,再将多行结果组合成一个支持别名的虚 ...

  2. hive sql之lateral view explode用法

    这篇文章讲的特别好 lateral view explode相当于笛卡尔乘积: 表1的每一行与表二的每一行组合,作为新的一行

  3. hive lateral view explode列拆分与行转列用法

    在日常工作中,我们在处理数据时,会遇到某个列存在多个数据的情况,如果想拿到这个列里面每个数据进行后续处理的话,这种情况下有两种处理方式: 第一种:如果这个列多个数据是固定数目,可以使用split切分 ...

  4. Hive Lateral View + explode 详解

    hive中的函数分为3类,UDF函数.UDAF函数.UDTF函数 UDF:一进一出 UDAF:聚集函数,多进一出,类似于:count/max/min UDTF:一进多出,如explore().pose ...

  5. 【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 ...

  6. [hive]lateral view炸开两层

    一. 说明 1.lateral view 侧视图lateral view要和explode/split等UDTF函数一起使用,他可以在函数拆分成多行的基础上,将表其他字段按照拆分结果进行聚合. 2.用 ...

  7. Hive Lateral View explode字段值为空时,导致数据异常丢失解决方案

    1.问题描述 日常工作中,我们经常会用Lateral View 结合explode把非结构化数据转化成结构化数据,但是该方法对应explode的内容是有非null限制的,否则就有可能造成数据缺失. 现 ...

  8. Hive Lateral View

    目录 Hive explode介绍: Hive posexplode介绍: Lateral View介绍: 使用多个Lateral View: outer关键字: Hive explode介绍: 它会 ...

  9. Hive Lateral View使用指南

    1. 语法 lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)* fromCl ...

最新文章

  1. 大学python和vb哪个简单-python和vb哪个简单
  2. c++中利用sizeof运算符计算结构体大小问题探讨
  3. javascript 模块化编程----模块的写法
  4. 在Ubuntu上安装RealPlayer的方法
  5. 计算机考研分数2019,2019考研分数线和国家线有什么关系
  6. c#操作ecxel的一些资源(downmoon搜集)
  7. 问题解决 xenapp6/6.5发布资源管理器explorer应用不能打开 一闪而过
  8. 准备入手Macbook Pro
  9. 【干货】前端工程与性能优化
  10. windows,linux桌面系统管理
  11. win10系统怎么删除远程桌面连接记录
  12. java钢铁之心,洛克人 Dash 2 EPISODE 2(第二部) - 巨大的遗产[日]下载
  13. 最全的厚黑学,教你怎样混社会(人生格言) 作者 李宗吾
  14. java中getTime()
  15. readlink 获取进程的绝对路径
  16. 相比高人气的 Rust、Go,为何 Java、C 在工具层面进展缓慢?
  17. Spring Kafka实战(3)—message listener创建方式探讨
  18. 仙居机器人_仙居三名高中生拿下国际机器人大赛总决赛冠军
  19. 华为v8原生态android,安卓原生系统的手机有哪些_2019安卓原生系统手机推荐_飞翔教程...
  20. Appium日记20161031 徐慧迅

热门文章

  1. [渝粤教育] 中南财经政法大学 生活中的管理会计 参考 资料
  2. 再日阿里云,鸡贼第二弹!以身试法,希望你不要中招了!!!
  3. ESXI6.7 windows虚拟机 取消Vmware Tools分辨率自适应/固定分辨率
  4. 文档/图片/视屏/音频在线格式转换工具(实用,免费)
  5. 网络安全内外忧患,发现儿童平板电脑中含有漏洞,容易遭遇黑客.
  6. 二维空间计算几何源码(一)
  7. 全网最全Unity面试题加强版之八《图形学相关》
  8. python打印出各种三角形
  9. c++实现split函数
  10. Apache软件服务|功能详解