LATERAL VIEW explode 说明: UDFArgumentException explode() takes an array or a map as a parameter, 主要是将array和map 打平;
比如:
有个test表,结构如下:
A | B | C |
---|---|---|
[“垂直频道优质网易号提权_实验组_1”,“mfv2替换实验_实验组_1”] | 1 | k1 |
null | 2 | k2 |
则select A_explode from test where B=1 lateral view explode A subview as A_explode
可得到结果:
垂直频道优质网易号提权_实验组_1
mfv2替换实验_实验组_1
但如果A是一个空的array或者map(值为null), lateral后不会返回任何值, 注意: 即使
select包含其他字段也不会返回任何值!
select包含其他字段也不会返回任何值!
例如test表还有B,C两列, 如果取A不为null, 写出如下SQL:
select A_explode,B,C, from test where B=1 lateral view explode A subview as A_explode
则结果为
A | B | C |
---|---|---|
垂直频道优质网易号提权_实验组_1 | 1 | k1 |
mfv2替换实验_实验组_1 | 1 | k1 |
如果取A为null, 写出如下SQL:
select A_explode,B,C, from test where B=2 lateral view explode A subview as A_explode
则结果什么都没有!!
这在做数据清洗的时候, 会遗留很多数据, 要避免这种情况出现, 需要对null的值进行特殊处理, 我采用的是写UDF的方法, 代码如下:
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;