我正在尝试编写一些性能意识代码,并思考是否应该为我的Dataframe上的汇总操作编写一个Aggregator或User-defined Aggregate Function(UDAF)来提高性能。我无法在任何地方找到关于这些方法的速度和哪个应该在Spark 2.0+中使用的数据。请参考以下链接:Aggregator 和 User-defined Aggregate Function。
你应该编写一个 Aggregator
而不是一个 UserDefinedAggregateFunction
,因为 UserDefinedAggregateFunction
会对每一行执行低效的序列化/反序列化任务。将 UserDefinedAggregateFunction
重写为 Aggregator
可以将性能从25%-30%提高到100倍,正如 在替换 UserDefinedAggregateFunction
为 Aggregator
的 pull request 中所述。
Rollup
聚合已经被Spark SQL支持了。 - Jacek Laskowskirollup
,但是使用自定义聚合函数。 - Thomas Russell