【发布时间】:2019-11-05 20:58:15
【问题描述】:
我想将双倍分数转换为整数。我尝试了 spark quantilediscretizer,但它太慢了。完成离散化过程需要数小时。但是当我使用 spark-sql 的函数 percentile 时,它比 quantilediscretizer 快得多。那么这两种方式有什么区别,在spark-sql中实现了哪些优化呢?
【问题讨论】:
标签: apache-spark apache-spark-sql
我想将双倍分数转换为整数。我尝试了 spark quantilediscretizer,但它太慢了。完成离散化过程需要数小时。但是当我使用 spark-sql 的函数 percentile 时,它比 quantilediscretizer 快得多。那么这两种方式有什么区别,在spark-sql中实现了哪些优化呢?
【问题讨论】:
标签: apache-spark apache-spark-sql
默认percentile 不提供任何优化。在内部它使用朴素的TypedImperativeAggregate,它收集所有值的计数(见update和merge),然后将结果用于compute quantiles locally。
这种方法唯一真正的性能优势是它非常简单。然而,在最坏的情况下它需要 O(N) 本地内存(感兴趣列中的所有值都是唯一的),因此它不可扩展,并且只能在相当有限的场景中应用。
对比QuantileDiscretizeruses Spark 的approxQuantile,它适用(修改)Greenwald-Khanna algorithm。这种方法的计算成本更高,但与蛮力方法不同,它是可扩展的,并且受到数据基数的限制。此外,它的性能可以通过调整relativeError来调整。
【讨论】: