hive中實現行轉列 Hive行轉列詳解

2021-10-16 14:31:19 字數 1785 閱讀 1454

需求:孫悟空 白羊座 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 第乙個引數是引數間的分隔符 ...