将一个字段多条记录(行)的内容,合并为一个值,轻微等效于 行 → 列 转置。
其中,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
