我想将RDD[Float]分成10个部分进行分位数离散化,不使用Spark.ML,因此我需要计算第10百分位、第20百分位…第80百分位、第90百分位
数据集非常大,无法收集到本地!
有什么高效的算法可以解决这个问题吗?
回答:
如果你使用的是Spark版本> 2.0,已经提供了这种功能。你需要将RDD[Float]转换为数据框。使用来自DataFrameStatFunctions
的approxQuantile(String col, double[] probabilities, double relativeError)
。根据文档介绍:
该方法实现了Greenwald-Khanna算法的一个变体(带有一些速度优化)。该算法首次出现在Greenwald和Khanna的《Space-efficient Online Computation of Quantile Summaries》一文中