一:前言
在某些場景下比如報表的產(chǎn)出爸吮,為了更加易于理解所宰,往往會行列互置這樣顯示握玛,又或者我們需要將某個相同鍵的值,所屬的屬性進行合并顯示甫菠,這樣都會用到行轉(zhuǎn)列或者列轉(zhuǎn)行挠铲。
二:行轉(zhuǎn)列如何實現(xiàn)
使用lateral view結(jié)合explode這樣的UDTF進行實現(xiàn),由于explode的參數(shù)要求是list()或者array()類型寂诱,所以往往還需要用到spilt函數(shù)進行分割拂苹。
以下是一個演示:
select
split(detail,',')[0] as uname
,split(detail,',')[1] as create_time
,split(detail,',')[2] as pv
from
(
select
concat('測試用戶,2019-10-02,7
#測試用戶,2019-10-05,4
#測試用戶,2019-10-07,5
#測試用戶,2019-10-03,6
#測試用戶,2019-10-04,3
#測試用戶,2019-10-01,3
#測試用戶,2019-10-06,4') as ct_str
) t
lateral view explode(split(ct_str,'#')) t2 as detail;
以上()當中為了演示只有select語句,正常來講是一條正常的sql痰洒,目的是將需要分割成多行的數(shù)據(jù)進行整合到一行當中去瓢棒,然后使用explode處理,split(ct_str,'#')的目的是將ct_str按照#分割成多行丘喻,explode這個UDTF可以返回0行或者大于1行的記錄脯宿,所以說explode和split往往結(jié)合起來使用,然后使用lateral view將多行結(jié)果組合成一個支持別名的虛擬表t2和列detail泉粉。然后在外層繼續(xù)使用split函數(shù)將返回行進一步分割连霉,這樣就實現(xiàn)了行轉(zhuǎn)列了。
三:列轉(zhuǎn)行如何實現(xiàn)
一般使用group by column..+concat_ws+collect_list/collect_set來實現(xiàn)
-- 準備數(shù)據(jù)
select * from dw_tmp.window_function_temp;
image.png
select
uname
,concat_ws(',',collect_list(cast(pv as string)))
from dw_tmp.window_function_temp
GROUP BY uname;
image.png
select
uname
,concat_ws(',',collect_set(cast(pv as string)))
from dw_tmp.window_function_temp
GROUP BY uname;
image.png