RDD
有一个非常有用的方法 aggregate,它允许累加一些零值并将其跨分区组合。有没有办法用 Dataset[T]
做到这一点。就我通过 Scala 文档看到的规范而言,实际上没有任何东西可以做到这一点。即使是 reduce 方法也只允许对以 T 作为两个参数的二元运算进行操作。有什么理由吗?如果有任何东西能够做到这一点?
非常感谢!
VK
最佳答案
有两个不同的类可用于在 Dataset
API 中实现类似aggregate
的行为:
UserDefinedAggregateFunction
它使用SQL
类型并将Columns
作为输入。初始值使用
initialize
方法定义,seqOp
使用update
方法,combOp
使用merge
方法。示例实现:How to define a custom aggregation function to sum a column of Vectors?
Aggregator
它使用带有Encoders
的标准 Scala 类型,并将记录作为输入。初始值使用
zero
方法定义,seqOp
使用reduce
方法,combOp
使用merge
方法。示例实现:How to find mean of grouped Vector columns in Spark SQL?
两者都提供额外的终结方法(分别为evaluate
和finish
),用于生成最终结果,可用于全局聚合和按键聚合。
关于scala - Spark Dataset聚合类似于RDD aggregate(zero)(accum, combiner),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42378806/