Hive中的explode与posexplode函数


 

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM