将一个字段多条记录(行)的内容,合并为一个值,轻微等效于 行 → 列 转置。
    其中,collect_list 是单纯的列表拼接,collect_set 会去重(相当于 Python 的 set 集合)。

    比如说原始表:

    F1 F2
    A 1
    A 2
    A 3
    B 4
    B 5
    B 5

    用 collect_list,

    1. 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