需求:孫悟空 白羊座 a
沙悟淨 射手座 a
宋鬆鬆 白羊座 b
豬八戒 白羊座 a
小鳳姐 射手座 a
轉換成以下格式:白羊座,a 孫悟空|豬八戒
白羊座,b 宋鬆鬆
射手座,a 沙悟淨|小鳳姐
思路:表的行轉列
知識點:concat(string1,string2) string1和string2需要是列名
-- 使用hive的beeline客戶端,使用t_vehicle_log,並檢視該錶的secma./bin/beeline
desc t_vehicle_log;
-- 對其中兩列字段進行拼接
select concat(vehicle_speed,vehicle_plate) from t_vehicle_log;
--concat() 對拼接的兩列字串中間用,連線
select concat(vehicle_speed,",",vehicle_plate) from t_vehicle_log;
加入我們要拼接多個列,並且需要用同樣的分隔符(如a,b,c,d),該怎麼做呢?
——我們可以使用concat_ws()
select concat_ws(",",monitor_id,camera_id,vehicle_plate) from t_vehicle_log;
如果某一列有很多重複的字段,我們需要對其進行去重,並對去重欄位返回乙個陣列,該怎麼辦呢?
—— 我們可以使用 collect_set()
select monitor_id from t_vehicle_log;
select collect_set(monitor_id) from t_vehicle_log;
以上為本次需求所需的知識點的講解,下面開始解決本次需求:
-- 建表:create table person_info(
name string,
constellation string,
blood_type string)
row format delimited fields terminated by "\t";
-- 插資料load data local inpath '/person_info.txt' into table person_info;
使用concat_ws()查詢:
select concat_ws(",",constellation,blood_type) c_b,name from person_info;
結果:select
t1.c_b,
collect_set(t1.name)
from(
select concat_ws(",",constellation,blood_type) c_b,
name from person_info
) t1
group by t1.c_b;
最終結果:collect_set()返回的是陣列,concat_ws()接受的string或者是string陣列
將陣列劃分開:
select
t1.c_b,
concat_ws("|",collect_set(t1.name))
from(
select concat_ws(",",constellation,blood_type) c_b,
name from person_info
) t1
group by t1.c_b;
結果:到此,任務完成。我們下期再見。
乙個不務正業的技術博主
hive中實現行轉列 hive中的列轉行和行轉列
1 列轉行 concat string1,string,連線括號內字串,數量不限。concat ws separator,string1,string2,連線括號內字串,數量不限,連線符為separator。collect set col 此函式只接受基本型別,主要是將字段的值進行去重彙總,產生ar...
Hive行轉列,列轉行
下面舉兩個例子 例一 行轉列 資料 a b 1 a c 2 a b 3 c d 4 c d 5 c d 6 轉化為 a b 1,2,3 c d 4,5,6 創表hive create table test1 col1 string,col2 string,col3 string row format...
Hive 行轉列 列轉行
並不是真正意義上的行轉列 列轉行。只是這樣叫的。concat stringa,stringb,stringc 返回輸入字串拼接後的結果,支援輸入任意多個字串 測試結果 可以連線任意多個 concat ws 分隔符 stringa,stringb 是乙個特殊的concat 第乙個引數是引數間的分隔符 ...