explode函數適用場景:將一行數據拆解成多行。
設表A:
col1 | col2 |
key1 | value11,value12...,value1m |
key2 | value21,value22...,value2m |
... | ... |
keyn | valuen1,valuen2...,valuenm |
我們發現字段col2是以英文逗號分隔的值,可以通過以下SQL語句將其拆解開來:
select A.col1,subview.col2
from A
lateral view explode(split(A.col2,',')) subview as col2;
注:
1、以上語句中的subview我們可以當成是拆解后子表的別名,而value則是拆解后該子表的字段別名;
2、通過explode(split(A.col2,','))我們可以指定分隔字段A.col2的分隔符,如果省略split()則使用默認分隔符是英文逗號。
拆解后變成以下形式:
col1 | col2 |
key1 | value11 |
key1 | value12 |
... | ... |
key1 | value1m |
key2 | value21 |
... | ... |
keyn | valuen1 |
keyn | valuen2 |
... | ... |
keyn | keynm |
posexplode具有比explode更高級的用法,上面的表A只有一列col2具有多值的形式,我們現在假設表A還有個字段col3,數據如下:
col1 | col2 | col3 |
key1 | value11,value12...,value1m | value11,value12...,value1m |
key2 | value21,value22...,value2m | value21,value22...,value2m |
... | ... | ... |
keyn | valuen1,valuen2...,valuenm | valuen1,valuen2...,valuenm |
我們現在需要將col2和col3同時拆解開來,且col2中的value和col3中的value順序和拆解之前的順序保持一致,語句如下:
select A.col1,s2.col2,s3.col3
from A
lateral view posexplode(split(A.col2,',')) s2 as idx2,col2,
lateral view posexplode(split(A.col3,',')) s3 as idx3,col3
where s2.idx2=s3.idx3;
注:以上語句中s2.idx2和s3.idx3分別是子視圖的兩個索引,我們where子句中使用s2.idx2=s3.idx3保證順序的一致性。
拆解后數據如下:
col1 | col2 | col3 |
key1 | value11 | value11 |
key1 | value12 | value12 |
... | ... | ... |
key1 | value1m | value1m |
key2 | value21 | value21 |
... | ... | ... |
keyn | valuen1 | valuen1 |
keyn | valuen2 | valuen2 |
... | ... | ... |
keyn | keynm | keynm |