hive行轉列與列轉行

簡單行轉列

  • 將一個融合多個信息的字段拆分爲多行
aaa,bbb,ccc  ===>  aaa
                   bbb
                   ccc
  • 實現方法:利用內置UDTF函數explode實現
split('aaa,bbb,ccc',','); //根據逗號進行分割,將複合字段轉化爲hive數組類型
explode(split('aaa,bbb,ccc',',')); //對得到的數據使用explode函數拆分爲多行
  • 實現結果
hive> select split('aaa,bbb,ccc',',');
OK
["aaa","bbb","ccc"]
----------------------------------------------
hive> select explode(split('aaa,bbb,ccc',','));
OK
aaa
bbb
ccc

複雜行轉列

  • 需求:將轉換後的多行信息與原表字段關聯查詢。
  • 比如:
    原始數據student表
name hobby
tom 唱歌,跳舞,彈琴
jack 唱歌,繪畫,打籃球
  • 轉換後數據
tom 唱歌
tom 跳舞
tom 彈琴
jack 唱歌
jack 繪畫
jack 打籃球
  • 拆分後的字段與原表的name字段是沒有辦法直接關聯的,因爲它們不是一張表。可以使用later view側視圖進行關聯查詢。
explode(split(hobby,',')) temp as x   //此語句本身返回的就是一張虛擬表 記爲temp 可以爲temp表的列指定字段名x
student lateral view temp     //使用later view可以直接關聯兩張表,保持原有映射關係
select student.name,temp.x from student lateral view explode(split(hobby,',')) temp as x;//完整寫法
  • 創建student表並加載數據
create external table student
(
   name string,
   hobby string
) row format delimited fields terminated by ' '; 
load data local inpath '/root/student.txt' into table student;
  • 執行sql語句 查看結果
hive> select student.name,temp.x from student lateral view explode(split(hobby,',')) temp as x;
OK
tom     唱歌
tom     跳舞
tom     彈琴
jack    唱歌
jack    繪畫
jack    打籃球

簡單列轉行

  • 將多行數據融合爲一行
aaa   ===>   aaa,bbb,ccc
bbb
ccc
  • 實現方法:
collect_set(column) //將某一列所有數據轉化爲一個集合(去重)
concat_ws(',',collect_set(column))  //將集合中所有元素以逗號分割連接爲字符串
  • 將dept表的dep列轉爲一行 展示結果
select dep from dept;
銷售
測試
開發
算法
--------------------------------------------------------
select concat_ws(',',collect_set(dep)) from dept;
銷售,測試,開發,算法
  • 此外還有一個聚合函數 collect_list 不去重

複雜列轉行

  • 轉換後的一行信息與原始行字段關聯查詢
  • 比如
    原始數據
name hobby
tom 唱歌
tom 跳舞
tom 彈琴
jack 唱歌
jack 繪畫
jack 打籃球

結果數據

tom 唱歌,跳舞,彈琴
jack 唱歌,繪畫,打籃球
  • 根據name字段進行分組,在每個分組內部name是唯一的可以直接查詢,hobby字段就可以使用collect_set與concat_ws進行連接爲複合字段。
  • 創建stu表導入數據
create external table stu
(
   name string,
   hobby string
) row format delimited fields terminated by ' '; 
load data local inpath '/root/stu.txt' into table stu;
  • 查詢:select name,concat_ws(’,’,collect_set(hobby)) from stu group by name;
  • 結果如下
OK
jack    唱歌,繪畫,打籃球
tom     唱歌,跳舞,彈琴
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章