簡單行轉列
- 將一個融合多個信息的字段拆分爲多行
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 唱歌,跳舞,彈琴