hive長錶轉寬表

需求分析

  • 本地原始數據
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":"西安"}
  • 然後進行嵌套查詢從map中取數據,key作爲字段名,value作爲字段值,因爲map中有三個鍵值對,所以會取出三個字段。
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;
  • 結果如下
OK
jack    25      女      重慶
tom     18      男      西安
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章