Spark sql 百分位数函数和 Spark 数据帧分位数离散器之间有什么区别?



我想将双倍分数转换为整数。我尝试了火花分化器,但它太慢了。完成离散化过程需要数小时。但是当我使用 spark-sql 的函数百分位数时,它比分位数离散器快得多。那么这两种方法之间有什么区别,在 spark-sql 中实现了哪些优化呢?

默认percentile不提供任何优化。在内部,它使用朴素TypedImperativeAggregate,收集所有值的计数(参见它的updatemerge(,然后使用结果在本地计算分位数。

这种方法唯一真正的性能优势是它非常简单。但是,在最坏的情况下,它需要 O(N( 本地内存(感兴趣列中的所有值都是唯一的(,因此它不可伸缩,只能在相当有限的场景中应用。

相比之下,QuantileDiscretizer使用Spark的approxQuantile,它应用(修改的(格林沃尔德-卡纳算法。这种方法的计算成本更高,但与暴力应用不同,它是可扩展的,并且受到数据基数的限制。此外,它的性能可以通过调整relativeError来调整。

最新更新