写在前面的话,hive的lateral view explode(map/array)函数,常常用于日常的代码中。本篇主要讲解被忽略的
outer
的作用。
===
lateral view 与 lateral view outer的区别
两者的区别:
主要就是当explode函数里传入的数据是否为null,lateral view explode(null) temp as id 时,结果不显示任何数据**(注意是指其他字段的数据也不返回**);
lateral view outer explode(
null
) temp as id 时,结果显示其他字段是有数据的,但id显示为null.两者相同点:都是炸裂函数,把一行数据炸成多行或者一列转多列也是可能的数据并且会带上匹配属性。
接下来我们直接上保姆级测试
测试1:
测试1:主要利用split把字符串变成数组类型传入explode函数中,把一行数据炸开形成多行
with user_view as ( --构造虚拟表
select 'zhangsan' name,'高级|砖石' level,'12' num,'爬山,跳舞,看书' favs
union all
select 'lisi' name, '中级|黄金' level,'15' num,'看电视,跳舞' favs
union all
select 'wangwu' name,'初级|青铜' level,'34' num,'游泳' favs
)
select name,level,num,colName1 as fav
from (
select *
from user_view a
lateral view explode( split(favs,',')) tabName1 as colName1
) d
结果:
name level num fav
zhangsan 高级 12 爬山
zhangsan 高级 12 跳舞
zhangsan 高级 12 看书
lisi 中级 15 看电视
lisi 中级 15 跳舞
wangwu 初级 34 游泳
测试2:
with user_view as ( --构造虚拟表
select 'zhangsan' name,'高级|砖石' level,'12' num,'爬山,跳舞,看书' favs
union all
select 'lisi' name, '中级|黄金' level,'15' num,'看电视,跳舞' favs
union all
select 'wangwu' name,'初级|青铜' level,'34' num,'游泳' favs
)
select name,level,num,colName1,colName2
from (
select *
from user_view a
lateral view explode( split(level,'|')) tabName1 as colName1
lateral view explode( split(favs,',')) tabName2 as colName2
) d
结果:
name level num colname1 colname2
zhangsan 高级|砖石 12 高级 爬山
zhangsan 高级|砖石 12 高级 跳舞
zhangsan 高级|砖石 12 高级 看书
zhangsan 高级|砖石 12 砖石 爬山
zhangsan 高级|砖石 12 砖石 跳舞
zhangsan 高级|砖石 12 砖石 看书
lisi 中级|黄金 15 中级 看电视
lisi 中级|黄金 15 中级 跳舞
lisi 中级|黄金 15 黄金 看电视
lisi 中级|黄金 15 黄金 跳舞
wangwu 初级|青铜 34 初级 游泳
**测试3:**开始加入null值,观察变化
with user_view as ( --构造虚拟表
select 'zhangsan' name,'高级|砖石' level,'12' num,'爬山,跳舞,看书' favs
union all
select 'lisi' name, '中级|黄金' level,'15' num,'看电视,跳舞' favs
union all
select 'wangwu' name,'初级|青铜' level,'34' num,'游泳' favs
)
select colName1,colName2
from user_view a
lateral view explode( array()) tabName1 as colName1
lateral view explode( split(favs,',')) tabName2 as colName2
不加outer的结果(结果不显示任何值):
colname1 colname2
测试4:
with user_view as ( --构造虚拟表
select 'zhangsan' name,'高级|砖石' level,'12' num,'爬山,跳舞,看书' favs
union all
select 'lisi' name, '中级|黄金' level,'15' num,'看电视,跳舞' favs
union all
select 'wangwu' name,'初级|青铜' level,'34' num,'游泳' favs
)
select colName1,colName2
from user_view a
lateral view **outer** explode( array()) tabName1 as colName1
lateral view explode( split(favs,',')) tabName2 as colName2
加outer的结果:
colname1 colname2
NULL 爬山
NULL 跳舞
NULL 看书
NULL 看电视
NULL 跳舞
NULL 游泳
写在后面,原创不易,欢迎点赞收藏支持一波哈。
版权声明:本文为weixin_45857425原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。