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