name message value
tom age 18
tom sex 男
tom address 西安
jack age 25
jack sex 女
jack address 重慶
轉換後數據
name age sex address
tom 18 男 西安
jack 25 女 重慶
實現思路
創建stu表 導入數據
create table stu
(
name string,
message string,
value string
) row format delimited fields terminated by ' ';
load data local inpath '/root/stu.txt' into table stu;
首先將每個用戶message與value兩個字段信息轉換爲map格式
//先以冒號連接兩個字段組成鍵值對,然後根據collect_set函數把所有鍵值對組成集合,利用concat_ws函數,將集合元素以逗號連接爲//字符串,最後利用str_to_map將字符串轉換爲map格式數據
select
name,str_to_map(concat_ws(',',collect_set(concat_ws(':', message, value)))) message1
from stu
group by name;
結果如下
OK
jack {"age":"25","sex":"女","address":"重慶"}
tom {"age":"18","sex":"男","address":"西安"}
select
name,
message1['age'] as age,
message1['sex'] as sex,
message1['address'] as address
from
(select
name,str_to_map(concat_ws(',',collect_set(concat_ws(':', message, value)))) as message1
from stu
group by name
) temp;