花2分钟理解hive的Lateral View + explode用法
explode为表生成函数:
作用 : 把map集合或数组array展开,其中每个键值对或数组中的每个元素都单独生成一行。
explode(array_or_map)就是内置表生成函数(UDTF),UDTF将为每个输入行生成零个或多个输出行。
拆开array可以这么做 : explode(array)
拆开map 可以这么做 : explode(split(map,’,’))
lateralView:
语法 : LATERAL VIEW udtf(expression) tableAlias AS columnAlias (’,’ columnAlias)*
示例的代码:
select goods_id2 from sales LATERAL VIEW explode(split(goods_id,’,’)) goods as goods_id2;
这里的sales就是basetable,lateral view可以使用basetable中的任意列,lateral view explode(split(goods_id,’,’))goods这个就是虚拟表,相当于在这个表中做select,然后goods_id2就是explode()后的列的列名
如果还不太理解的话有个偏门一点的方法,就是把 lateral view 理解为桥梁,通过它能把左边从sales里面的数据和右边explode展开的数据一一对应连接起来,这样就组成一张新的虚拟表叫做goods[这表名可随便写也可不写],其中explode后的列名叫goods_id2,最后就是按需要对虚拟表进行select啦
注意:如果展开的列数据类型map类型,那么最后在as后面用2个字段去分别接收key列和value列,字段间用逗号隔开即可;
Lateral View + Outer+ explode同理,Outer关键字可以把不输出的UDTF空结果,输出成NULL,意思就是Lateral View左边的有字段存在,但右边没有对应的键值对或array让explode展开,那么outer就让它右边的explode展开的结果为null, 如果不加outer这一项直接就不会被查询出来了,这样防止了丢失数据
参考链接
https://zhuanlan.zhihu.com/p/115913870
https://blog.csdn.net/bitcarmanlee/article/details/51926530