有以下表
id | name |
---|---|
1001 | A |
1001 | B |
1001 | C |
实现以下功能
id | name |
---|---|
1001 | A,B,C |
即按照id 进行group by,将每个id的name组成一个list放到name字段中。
select id,collect_list(name) from table group by id
- 1
若name中有重复的值,可以用collect_set函数进行去重
collect_list函数返回的类型是array< ? >类型,?表示该列的类型
怎么转为string类型?
我们可以使用concat_ws函数,但是该函数仅支持string和array< string > 所以对于该列不是string的列,先转为string
select id,concat_ws(',',collect_list(cast (name as string))) from table group by id
- 1
最终实现了我们需要的输出结果
concat_ws函数的意思是用逗号将所有的string组合到一起,用逗号分割显示
select concat_ws(',',"A","B");
- 1
上面代码的结果就是
A,B
以上是行转列,列转行可用到explode
hive> select explode(split(concat_ws(',','1','2','3','4'),',')) from default.dual;
1
2
3
4
- 1
- 2
- 3
- 4
- 5
表示1,2,3,4拼接起来,然后再用逗号分隔成列,应用到表中如下面所示
hive> select * from tt s lateral view explode(split("a b c d"," ")) t3 as sp; ------需要起别名,tt表中只有一个字段有数据。
A a
A b
A c
A d