如何在 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.
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.