我想将双分数转换为整数。我尝试了火花分位数解散器,但是它太慢了。完成离散化过程需要几个小时。但是,当我使用spark-sql的函数percentile时,它比QuantileDiscretizer快得多。那么这两种方法有什么区别?在spark-sql中实现了哪些优化?
答案 0 :(得分:1)
默认percentile
不提供任何优化。在内部,它使用朴素的TypedImperativeAggregate
,它会收集所有值的计数(请参见update
和merge
),然后将结果用于compute quantiles locally。
此方法的唯一真正优势是它非常简单。但是,在最坏的情况下(需要关注的列中的所有值都是唯一的),它需要O(N)个本地内存,因此它不具有可伸缩性,并且只能在相当有限的情况下使用。
相反,QuantileDiscretizer
uses适用于(修改)approxQuantile
的Spark Greenwald-Khanna algorithm。这种方法在计算上更加昂贵,但与强力方法不同,它是可伸缩的,并且受数据基数的限制。此外,可以通过调整relativeError
来调整其性能。