1.相關函數說明
CONCAT(string A/col, string B/col…):
返回輸入字符串連接后的結果,支持任意個輸入字符串;
CONCAT_WS(separator, str1, str2,...):
它是一個特殊形式的 CONCAT()。
第一個參數剩余參數間的分隔符。
分隔符可以是與剩余參數一樣的字符串。
如果分隔符是 NULL,返回值也將為 NULL。
這個函數會跳過分隔符參數后的任何 NULL 和空字符串。分隔符將被加到被連接的字符串之間;
COLLECT_SET(col):
函數只接受基本數據類型,它的主要作用是將某字段的值進行去重匯總,產生array類型字段。
2. 數據准備
表6-6 數據准備
name |
constellation |
blood_type |
孫悟空 |
白羊座 |
A |
大海 |
射手座 |
A |
宋宋 |
白羊座 |
B |
豬八戒 |
白羊座 |
A |
鳳姐 |
射手座 |
A |
3. 需求
把星座和血型一樣的人歸類到一起。結果如下:
射手座,A 大海|鳳姐
白羊座,A 孫悟空|豬八戒
白羊座,B 宋宋
4. 創建本地constellation.txt,導入數據
[hadoop@hadoop102 datas]$ vi constellation.txt
孫悟空 白羊座 A
大海 射手座 A
宋宋 白羊座 B
豬八戒 白羊座 A
鳳姐 射手座 A
5. 創建hive表並導入數據
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/constellation.txt" into table person_info;
6. 按需求查詢數據
select t.base CONCAT_WS("|",COLLECT_SET(t.name)) as name from (select name, concat(constellation,',',blood_type) as base from person_info;) t group by t.base;