十一、行轉列、列轉行函數

一、行轉列

1、相關行數

CONCAT(string A/col, string B/col…):返回輸入字符串連接後的結果,支持任意個輸入字符串;

CONCAT_WS(separator, str1, str2,…):它是一個特殊形式的 CONCAT()。第一個參數剩餘參數間的分隔符。分隔符可以是與剩餘參數一樣的字符串。如果分隔符是 NULL,返回值也將爲 NULL。這個函數會跳過分隔符參數後的任何 NULL 和空字符串。分隔符將被加到被連接的字符串之間;

COLLECT_SET(col):函數只接受基本數據類型,它的主要作用是將某字段的值進行去重彙總,產生array類型字段。



2、數據準備

數據

[root@hadoop102 datas]$ vi person.txt

孫悟空  白羊座  A
大海    射手座  A
宋宋    白羊座  B
豬八戒  白羊座  A
鳳姐    射手座  A

建表
create table person_info(
name string, 
constellation string, 
blood_type string) 
row format delimited fields terminated by "\t";

導入數據
load data local inpath '/opt/module/datas/person.txt' into table person_info;
3、concat函數使用
hive (default)> select name,concat(constellation,',',blood_type) hb from person_info;
OK
name    hb
孫悟空  白羊座,A
大海    射手座,A
宋宋    白羊座,B
豬八戒  白羊座,A
鳳姐    射手座,A
4、collect_set 數據列去重聚合
select hb,collect_set(name) names 
from (
select name,concat(constellation,',',blood_type) hb from person_info
) t 
group by t.hb;

hb      names
射手座,A        ["大海","鳳姐"]
白羊座,A        ["孫悟空","豬八戒"]
白羊座,B        ["宋宋"]

5、concat_ws 將arr數組列合併爲字符串
select hb,concat_ws('|',collect_set(name)) namestr
from (
select name,concat(constellation,',',blood_type) hb from person_info
) t 
group by t.hb;

hb      namestr
射手座,A        大海|鳳姐
白羊座,A        孫悟空|豬八戒
白羊座,B        宋宋

二、列轉行

1、函數說明

EXPLODE(col):將hive一列中複雜的array或者map結構拆分成多行。

LATERAL VIEW用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

解釋:用於和split, explode等UDTF一起使用,它能夠將一列數據拆成多行數據,在此基礎上可以對拆分後的數據進行聚合。

2、數據準備

將前面數據聚合行函數sql,新建表

create table test2 as
select hb,collect_set(name) names 
from (
select name,concat(constellation,',',blood_type) hb from person_info
) t 
group by t.hb;

#數據查看
hive (default)> select hb,names from test2;
OK
hb      names
射手座,A        ["大海","鳳姐"]
白羊座,A        ["孫悟空","豬八戒"]
白羊座,B        ["宋宋"]

3、將names數據炸裂開變爲行
hive (default)> select hb,name from test2 lateral view explode(names) table_tmp as name;
OK
hb      name
射手座,A        大海
射手座,A        鳳姐
白羊座,A        孫悟空
白羊座,A        豬八戒
白羊座,B        宋宋
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章