HiveLateralView - huangyuefeng/study GitHub Wiki

Hive技术LateralView横空出世解救explode

src_url

  • 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:

  1. 在udtf前面用,比如explode前面

  2. 在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,检查对应的结果。

refer

⚠️ **GitHub.com Fallback** ⚠️