将一个字段多条记录(行)的内容,合并为一个值,轻微等效于 行 → 列 转置。
其中,collect_list 是单纯的列表拼接,collect_set 会去重(相当于 Python 的 set 集合)。
比如说原始表:
F1 | F2 |
---|---|
A | 1 |
A | 2 |
A | 3 |
B | 4 |
B | 5 |
B | 5 |
用 collect_list,
SELECT F1, collect_list(F2) ... GROUP BY F1
结果是:
F1 | ‘collect_list(F2)’ |
---|---|
A | [“1”, “2”, “3”] |
B | [“4”, “5”, “5”] |
用 collect_set,
SELECT F1, collect_set(F2) ... GROUP BY F1
结果是:
F1 | ‘collect_set(F2)’ |
---|---|
A | [“1”, “2”, “3”] |
B | [“4”, “5”] |
可以引用列表中的值,比如:
SELECT F1, collect_set(F2)[0] ... GROUP BY F1
结果是:
F1 | ‘collect_set(F2)[0]’ |
---|---|
A | 1 |
B | 4 |
我不太赞同普遍的说法“collect_set 可以突破 GROUP BY 的限制”,因为这本身就可以理解成像 COUNT 等函数一样,是在 GROUP BY 之后追加字段的操作,只不过没有丢失细节信息罢了。
这两个函数输出集合内的元素排序是未指定的,可能出现值相同但顺序不同的情况。
通常追加 DISTRIBUTE BY … SORT BY … 语句来解决这个问题。
另外注意这样操作的执行效率比较低。
Reference: https://www.cnblogs.com/cc11001100/p/9043946.html