我最近玩过UDAF并查看了内置聚合函数collect_list
的源代码,我很惊讶merge
没有实现org.apache.spark.sql.catalyst.expressions.aggregate.collect.Collect
方法,虽然我认为这是非常直接的(只是连接两个数组)。代码取自override def merge(buffer: InternalRow, input: InternalRow): Unit = {
sys.error("Collect cannot be used in partial aggregations.")
}
df
答案 0 :(得分:2)
不再是SPARK-1893,但我认为初始设计主要考虑collect_list
。
因为collect_list
在逻辑上等同于groupByKey
,所以动机将完全相同,以避免长时间的GC暂停。特别是groupByKey
中的地图侧合并已被Spark SPARK-772禁用:
按键组合映射侧组合并不会减少洗牌后的数据量。相反,它迫使更多的对象进入旧的,导致更糟糕的GC。
所以要发表评论
我认为这是非常直接的(只是连接两个数组)。
它可能很简单,但它不会增加太多的值(除非在它之上有另一个减少操作)并且序列连接很昂贵。