HiveLateralView - huangyuefeng/study GitHub Wiki
- UDTF的conjunction
需求场景来自 Hive技术explode求解救
Lateral view 其实就是用来和像类似explode这种UDTF函数联用的。lateral view 会将UDTF生成的结果放到一个虚拟表中,然后这个虚拟表会和输入行即每个game_id进行join 来达到连接UDTF外的select字段的目的。
- Lateral View Syntax
lateralView: LATERAL VIEW udtf(expression) tableAlias AS columnAlias (',' columnAlias)*
fromClause: FROM baseTable (lateralView)*
可以看出,可以在2个地方用Lateral view:
-
在udtf前面用,比如explode前面
-
在from baseTable后面用
- 单个Lateral View
我们先解决上一节的问题,这种叫单个Lateral View。
select game_id, user_id
from login_game_log lateral view explode(split(userl_ids,'\\[\\[\\[')) snTable as user_id ;
- 多个Lateral View
From语句后可以跟多个Lateral View。
如下输入数据,
Array col1 | Array col2 |
---|---|
[1, 2] | [a", "b", "c"] |
[3, 4] | [d", "e", "f"] |
ETL目标: 想同时把第一列和第二列拆开,类似做笛卡尔乘积。
int myCol1 | string myCol2 |
---|---|
1 | "a" |
1 | "b" |
1 | "c" |
2 | "a" |
2 | "b" |
2 | "c" |
3 | "d" |
3 | "e" |
3 | "f" |
4 | "d" |
4 | "e" |
4 | "f" |
这个语法也很简单
SELECT myCol1, myCol2 FROM baseTable
LATERAL VIEW explode(col1) myTable1 AS myCol1
LATERAL VIEW explode(col2) myTable2 AS myCol2;
- Outer Lateral View
还有一种情况,如果UDTF转换的Array是空的怎么办呢? 在Hive0.12里面会支持outer关键字,如果UDTF的结果是空,默认会被忽略输出。 如果加上outer关键字,则会像left outer join 一样,还是会输出select出的列,而UDTF的输出结果是NULL。
select * FROM login_game_log LATERAL VIEW explode(array()) C AS a ;
结果是什么都不输出。
如果加上outer关键字:
SELECT * FROM login_game_log LATERAL VIEW OUTER explode(array()) C AS a limit 10;
输出结果如下:
game66 winning1ren[[[13810537508 NULL
game101 15358083654[[[ab33787873[[[zjy18052480603[[[shlg1881826[[[lxqab110 NULL
game101 hu330602003[[[hu330602004[[[hu330602005[[[15967506560 NULL
- 总结
Lateral View通常和UDTF一起出现,为了解决UDTF不允许再select字段的问题。 Multiple Lateral View可以实现类似笛卡尔乘积。 Outer关键字可以把不输出的UDTF的空结果,输出成NULL,防止丢失数据。
- 来个题目
把本节用到的数据load到hive表里, 运行对应HQL,检查对应的结果。