1. 程式人生 > 其它 >explode與lateral view解析 hive

explode與lateral view解析 hive

技術標籤:大資料處理hadoop/sparklateralexplodesql

工作中看程式碼時遇到lateral view explode(split(sni_type,',')) snTable as sni_info ,初看挺一臉懵逼的,細查之後才明白是對欄位sni_type進行分割之後,將分割後中的元素值轉換為了多行。具體:

split()函式

split()函式用於分割資料。語法格式為split(str,sep) ,引數str為字串型別的欄位,sep為分割符(支援正則),結果返回一個數組array。如上面split(sni_type,',') ,假設欄位sni_type的值為“7,17,20,8”,則上述以逗號分割,得到陣列['7','17','20','8']。

注意:對於 “.”,"|“這樣的特殊字元,不加”\“的時候是特殊字元,加了以後才是普通字元,而對於”\d"的字元,需要加"\“後才是特殊字元,就是是說”\\d"才是匹配數字。

explode 函式

用於將一行轉換為多行。維基百科的解釋是“explode() takes in an array (or a map) as an input and outputs the elements of the array (map) as separate rows. UDTFs can be used in the SELECT expression list and as a part of LATERAL VIEW.”即將一個為array或者map的欄位中的元素分開成為獨立的行。

-- 假設sni_type的值為 "25,36,100"
select explode(split(sni_type,",")) as partSni
from ods_up_content_source
where sni_type is not NULL  and dt='20210104' and size(split(sni_type,","))>3
limit 10;

--其中的一個返回結果為
25
36
100

lateral view 函式

lateral view 用於將使用者生成的資料表進行連線。wiki的解釋為:”Lateral view is used in conjunction with user-defined table generating functions such as explode(). As mentioned in Built-in Table-Generating Functions, a UDTF generates zero or more output rows for each input row. A lateral view first applies the UDTF to each row of base table and then joins resulting output rows to the input rows to form a virtual table having the supplied table alias“

初看上去有點不好理解,先看個報錯的示例:

即如果直接select只能選擇單列,不能選擇多個欄位。而此時,lateral view就派上用場了,可將多個欄位進行連線。

select sni_type,sni_info
from ods_up_content_source
lateral view explode(split(sni_type,',')) snTable as sni_info
where sni_type is not NULL  and dt='20210104' and size(split(sni_type,","))>3
limit 10;

結果顯示:

實際處理中,select選擇的其他的欄位的資料會複製。可以看出如果原來是m行個sni_type,每個sni_type都是含n個元素,則新得到的有m*n行。

綜上:lateral view用於和split, explode等UDTF一起使用,它能夠將一行資料拆成多行資料,在此基礎上可以對拆分後的資料進行聚合。lateral view首先為原始表的每行呼叫UDTF,UDTF會把一行拆分成一或者多行,lateral view再把結果組合,產生一個支援別名表的虛擬表。

鳴謝與參考:

https://blog.csdn.net/yahahassr/article/details/97911676

https://blog.csdn.net/bitcarmanlee/article/details/51926530

https://blog.csdn.net/wangwangstone/article/details/112687431