Hive的lateral view [outer] explode()教程(好文收藏)

  • Post author:
  • Post category:其他


写在前面的话,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 版权协议,转载请附上原文出处链接和本声明。