如何在 Spark 中使用自定义类型安全聚合器 SQL

How to use custom type-safe aggregator in Spark SQL

Spark 文档描述了如何创建 untyped user defined aggregate function (code) (aka udaf) and a strongly-typed aggregator (code)(又名 org.apache.spark.sql.expressions.Aggregator 的子类)。

我知道你可以通过 spark.udf.register("udafName", udafInstance) 注册一个在 sql 中使用的 udaf,然后像 spark.sql("SELECT udafName(V) as aggV FROM data") 一样使用它。

有没有办法在 sql 中也使用聚合器?

不是真的 Aggregator API 是专门为 "strongly" 类型 Datasets 设计的。您会注意到,它不需要 Columns 但始终对整个记录对象进行操作。

这并不真正适合 SQL 处理模型:

  • 在 SQL 中,您总是在 Dataset[Row] 上操作。 Aggregator.
  • 用处不大
  • 操作应用于列,而 Aggregator 需要完整的 Row

与 SQL 一起使用 API 您可以创建 UserDefinedAggregateFunction which can be registered using standard methods.