列轉行,行轉列(hivesql)
阿新 • • 發佈:2021-02-02
一、笛卡爾積
笛卡爾積即交叉連線,返回結果的行數等於兩個錶行數的乘積。
笛卡爾積會出現的可能情況:
1.省略連線條件
2.連線條件無效
3.所有表中的所有資料互相連線
二、列轉行
concat_ws():
concat_ws (separator,字串A/欄位名A,字串B/欄位名B…)是concat的特殊形式,第一個引數是其他引數的分隔符,分隔符會放到連線的字串之間,分隔符可以是一個字串,也可以是其他引數.如果分隔符為NULL,則結果為NULL,函式會忽略任何分隔符引數後的 NULL值。但是concat_ws( )不會忽略任何空字串。(然而會忽略所有的 NULL),如果引數為string型別陣列則合併陣列內字串
collect_set()/collect_list():
collect_set( )函式只接受基本資料型別,作用是對引數欄位進行去重彙總,返回array型別欄位.
collect_list()函式和collect_set( )作用一樣,只是前者不去重,後者去重.
/* 原始資料
name gender times
李白 男 唐
程咬金 男 唐
孫悟空 男 神話
豬八戒 男 神話
*/
-- 先用collect_set將列拼接在一起,然後再通過concat_ws進行展開拼接
select a.g_t, concat_ws( '-',collect_set(a.name ) ) name
from
( select name, concat ( gender, ', ''times) g_t
from
hero_info
) a
group by a.g_t;
/*查詢結果
男,唐 李白-程咬金
男,神話 孫悟空,豬八戒
*/
三、行轉列
split()︰將一個字串按照指定字元分割,結果為一個array
explode():將一列複雜的array或者map拆分為多行,它的引數必須為map或array
lateral view用於和split, explode等UDTF一起使用,它能夠將一行資料拆成多行資料,在此基礎上可以對拆分後的資料進行聚合。lateral view首先為原始表的每行呼叫UDTF,UTDF會把一行拆分成一或者多行,lateralview再把結果組合,產生一個支援別名表的虛擬表。
/*原始資料
province city
河南 鄭州市,開封市,洛陽市
河北 石家莊市,保定市,邢臺市
湖南 長沙市,岳陽市,常德市
*/
-- addr為表名
select province, city_n from
addr lateral view
explode ( split(city,',' ) ) addr_tmp as city_n;
/*
-- 查詢結果
河南 鄭州市
河南 開封市
河南 洛陽市
河北 石家莊市
河北 保定市
河北 邢臺市
湖南 長沙市
湖南 岳陽市
湖南 常德市
*/