假設(shè)我們的數(shù)據(jù)如下所示,表為test表:
A B C
190 [1030,1031,1032,1033,1190] select id
191 [1030,1031,1032,1033,1190] select id
可以看到,我們的B字段是ARRAY類型的,我們假如想把B的每一個(gè)元素變成一行,我們可以使用explode函數(shù):
select explode(B) as D from test
這樣可以達(dá)到如下的目的
D
1030
1031
1032
1033
....
不過假如我們想要達(dá)到下面的效果呢?
190 1030 select id
190 1031 select id
190 1032 select id
190 1033 select id
190 1190 select id
191 1030 select id
191 1031 select id
191 1032 select id
191 1033 select id
191 1190 select id
此時(shí),我們?cè)偈褂孟旅娴膆ive語句,發(fā)現(xiàn)已經(jīng)不行了,因?yàn)閑xplode函數(shù)使用時(shí)不能再有其他的列:
select A,explode(B),C as D from test
如果想實(shí)現(xiàn)上面的效果,正確的做法是使用LATERAL VIEW,hive sql如下:
select A,B,C from test LATERAL VIEW explode(B) table1 as B
lateral view用于和split、explode等UDTF一起使用的,能將一行數(shù)據(jù)拆分成多行數(shù)據(jù),在此基礎(chǔ)上可以對(duì)拆分的數(shù)據(jù)進(jìn)行聚合,lateral view首先為原始表的每行調(diào)用UDTF,UDTF會(huì)把一行拆分成一行或者多行,lateral view在把結(jié)果組合,產(chǎn)生一個(gè)支持別名表的虛擬表。