1. 程式人生 > 其它 >列轉行,行轉列(hivesql)

列轉行,行轉列(hivesql)

技術標籤:筆記hivesql

一、笛卡爾積

笛卡爾積即交叉連線,返回結果的行數等於兩個錶行數的乘積。
笛卡爾積會出現的可能情況:
1.省略連線條件
2.連線條件無效
3.所有表中的所有資料互相連線

二、列轉行

concat_ws():
concat_ws (separator,字串A/欄位名A,字串B/欄位名B…)是concat的特殊形式,第一個引數是其他引數的分隔符,分隔符會放到連線的字串之間,分隔符可以是一個字串,也可以是其他引數.如果分隔符為NULL,則結果為NULL,函式會忽略任何分隔符引數後的 NULL值。但是concat_ws( )不會忽略任何空字串。(然而會忽略所有的 NULL),如果引數為string型別陣列則合併陣列內字串

例:concat_ws( ‘,’, [ 'a ', ‘b’, 'c ’ ])–> 'a,b,c ’

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用法: lateral view udtf(欄位名)表別名/表臨時名as列別名/列臨時名

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;

/*
-- 查詢結果
河南      鄭州市
河南      開封市
河南      洛陽市
河北      石家莊市
河北       保定市
河北      邢臺市
湖南       長沙市
湖南       岳陽市
湖南       常德市
*/