spark sql百分位数函数和spark数据帧分位数离散化器之间的区别是什么?

时间:2019-06-24 04:52:31

标签: apache-spark apache-spark-sql

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

1 个答案:

答案 0 :(得分:1)

默认percentile不提供任何优化。在内部,它使用朴素的TypedImperativeAggregate,它会收集所有值的计数(请参见updatemerge),然后将结果用于compute quantiles locally

此方法的唯一真正优势是它非常简单。但是,在最坏的情况下(需要关注的列中的所有值都是唯一的),它需要O(N)个本地内存,因此它不具有可伸缩性,并且只能在相当有限的情况下使用。

相反,QuantileDiscretizer uses适用于(修改)approxQuantile的Spark Greenwald-Khanna algorithm。这种方法在计算上更加昂贵,但与强力方法不同,它是可伸缩的,并且受数据基数的限制。此外,可以通过调整relativeError来调整其性能。