spark:聚合器和UDAF有什么区别?

Tyl*_*归玉门 2 aggregate apache-spark apache-spark-sql spark-dataframe

在Spark的文档中,聚合器:

抽象类Aggregator [-IN,BUF,OUT]扩展了Serializable

用户定义的聚合的基类,可以在数据集操作中使用该基类来获取组中的所有元素并将它们减少为单个值。

UserDefinedAggregateFunction为:

抽象类UserDefinedAggregateFunction扩展了Serializable

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

根据Dataset Aggregator-Databricks的说法,“聚合器类似于UDAF,但是接口以JVM对象而不是Row的形式表示。”

看来这两个类非常相似,除了接口中的类型以外还有什么其他区别?

一个类似的问题是:UDAF与聚合器在Spark中的性能

小智 5

除了类型之外,一个根本的区别是外部接口:

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

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

处理状态也有所不同:

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