Hive行列轉(zhuǎn)換
之前寫過一篇SQL行列轉(zhuǎn)換,主要是使用 max(case when ... then ... else ... end) 行轉(zhuǎn)列,union 列轉(zhuǎn)行。在 Hive 中同樣也提供了兩種方式進(jìn)行行列轉(zhuǎn)換。
lateral view explode 列轉(zhuǎn)行

lateral view 和 explode 將 hive 一系列中復(fù)雜的 array 或者 map 結(jié)構(gòu)拆分成多行數(shù)據(jù),在此基礎(chǔ)上可以對(duì)拆分后的數(shù)據(jù)進(jìn)行聚合。
思路:
先用 split 函數(shù)將 C 列分割成數(shù)組; 再使用 lateral view 結(jié)合 explode 炸裂。
select A, B, C_new from table1
lateral view explode(split(C,",")) temp_table AS C_new;
concat_ws 行轉(zhuǎn)列

concat(str1, str2):返回輸入字符串連接后的結(jié)果,支持任意個(gè)輸入字符串。 concat_ws(separator,str1,str2,...):它是一個(gè)特殊形式 concat,第一個(gè)參數(shù)為分隔符,如果分隔符是 NULL,返回值也將為 NILL,這個(gè)函數(shù)會(huì)跳過分隔符參數(shù)后的任何 NULL 和空字符串,分隔符被加到被連接的字符串之間。 collect_set(col):函數(shù)只接受基本數(shù)據(jù)類型,它的主要將某字段的值進(jìn)行去重匯總,產(chǎn)生 array 類型字段。
思路:
先使用 concat(constellation,",",blood_type),將星座和血型連接; 用 collect_set 函數(shù)對(duì) name 聚合; 用 concat_ws 函數(shù)對(duì)聚合后的 name 用"|"分割。
select
constellation_blood_type ,
concat_ws("|",collect_set(name))
from
(select
concat(constellation,",",blood_type) constellation_blood_type
name
from
person_info)t1
group by constellation_blood_type ;評(píng)論
圖片
表情
