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 |