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 " ";
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;