在Hive中将列转换为逗号分隔的值

12

这个问题在SQL中已经被问答过了(将多行合并成用逗号分隔的一行),那么其中提到的任何方法是否也适用于Hive呢?例如,从以下形式:

+------+------+
| Col1 | Col2 |
+------+------+
| a    | 1    |
| a    | 5    |
| a    | 6    |
| b    | 2    |
| b    | 6    |
+------+------+

到这个:

+------+-------+
| Col1 | Col2  |
+------+-------+
| a    | 1,5,6 |
| b    | 2,6   |
+------+-------+
3个回答

22

聚合函数collect_set可以实现您想要的功能。这里是文档。所以您可以编写类似以下的查询:

SELECT Col1, collect_set(Col2)
FROM your_table
GROUP BY Col1;

然而,MySQL的GROUP BY与Hive的collect_set之间有一个显著的区别,即GROUP_CONCAT在生成的数组中保留重复项,而collect_set会删除数组中出现的重复项。在您展示的示例中,Col2没有重复的分组值,因此您可以继续使用它。


GROUP_CONCAT可以通过使用DISTINCT消除重复项。 GROUP_CONCAT(     DISTINCT expression     ORDER BY expression     SEPARATOR sep ); - Sameer

8

还有一个collect_list函数,它将接受完整列表(包括重复项)。


5

试试这个

SELECT Col1, concat_ws(',', collect_set(Col2)) as col2
FROM your_table
GROUP BY Col1;

apache.org documentation


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接