spark:Aggregator和UDAF有什么区别?

时间:2018-01-10 05:03:27

标签: apache-spark apache-spark-sql spark-dataframe aggregate

在Spark的文档中,聚合器:

  

抽象类聚合器[-IN,BUF,OUT]扩展了Serializable

     

用户定义聚合的基类,可以是   用于数据集操作以获取组的所有元素   将它们减少到一个值。

UserDefinedAggregateFunction是:

  

抽象类UserDefinedAggregateFunction扩展了Serializable

     

实现用户定义的聚合函数的基类   (UDAF)。

根据Dataset Aggregator - Databricks,“聚合器类似于UDAF,但接口用JVM对象表示而不是行。”

看来这两个类非常相似,除了界面中的类型之外还有哪些其他差异?

类似的问题是:Performance of UDAF versus Aggregator in Spark

1 个答案:

答案 0 :(得分:4)

除了类型之外,根本区别在于外部接口:

  • Aggregator需要一个完整的Row(适用于“强力”类型的API)。
  • UserDefinedAggregationFunction需要一组Columns

这使得Aggregator的灵活性降低,尽管整体API更加用户友好。

处理状态也有区别:

  • Aggregator是有状态的。取决于其缓冲区的可变内部状态。
  • UserDefinedAggregateFunction是无国籍的。缓冲区的状态是外部的。