为什么Spark中的collect_list不使用部分聚合

时间:2018-02-15 10:23:29

标签: apache-spark dataframe aggregation

我最近玩过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

1 个答案:

答案 0 :(得分:2)

不再是SPARK-1893,但我认为初始设计主要考虑collect_list

因为collect_list在逻辑上等同于groupByKey,所以动机将完全相同,以避免长时间的GC暂停。特别是groupByKey中的地图侧合并已被Spark SPARK-772禁用:

  

按键组合映射侧组合并不会减少洗牌后的数据量。相反,它迫使更多的对象进入旧的,导致更糟糕的GC。

所以要发表评论

  

我认为这是非常直接的(只是连接两个数组)。

它可能很简单,但它不会增加太多的值(除非在它之上有另一个减少操作)并且序列连接很昂贵。