Hive_行转列(多行转一个集合/数组)

archive 2019-11-06

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,导入数据

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

相关推荐