在Spark的文档中,聚合器:
抽象类聚合器[-IN,BUF,OUT]扩展了Serializable
用户定义聚合的基类,可以是 用于数据集操作以获取组的所有元素 将它们减少到一个值。
UserDefinedAggregateFunction是:
抽象类UserDefinedAggregateFunction扩展了Serializable
实现用户定义的聚合函数的基类 (UDAF)。
根据Dataset Aggregator - Databricks,“聚合器类似于UDAF,但接口用JVM对象表示而不是行。”
看来这两个类非常相似,除了界面中的类型之外还有哪些其他差异?
答案 0 :(得分:4)
除了类型之外,根本区别在于外部接口:
Aggregator
需要一个完整的Row
(适用于“强力”类型的API)。UserDefinedAggregationFunction
需要一组Columns
。这使得Aggregator
的灵活性降低,尽管整体API更加用户友好。
处理状态也有区别:
Aggregator
是有状态的。取决于其缓冲区的可变内部状态。UserDefinedAggregateFunction
是无国籍的。缓冲区的状态是外部的。