【问题标题】:Exact quantiles instead or approximate ones in Spark?在 Spark 中使用精确分位数还是近似分位数?
【发布时间】:2020-01-23 03:10:24
【问题描述】:

为了计算分位数,我使用了approxQuantile 方法,该方法可从DatasetSpark 的任何DatasetDataframe 函数中访问。它近似它们的方式is explained by in this post

@Test
@DisplayName("Quantiles de la population communale française")
public void quantiles() throws TechniqueException {
   Dataset<Row> populationCommunes = individus().selectExpr("populationTotale");

   double[] quantiles = populationCommunes.stat().approxQuantile("populationTotale", new double[] {0.1, 0.25, 0.5, 0.75, 0.9}, 0);
   LOGGER.info("Population des communes françaises :\n Q(10%) : {}, Q(25%) = {}, Q(50%) = {}, Q(75%) = {}, Q(90%) = {}", 
      quantiles[0], quantiles[1], quantiles[2], quantiles[3], quantiles[4]); 
}

结果令人放心:

Population des communes françaises :
 Q(10%) : 105.0, Q(25%) = 204.0, Q(50%) = 468.0, Q(75%) = 1186.0, Q(90%) = 3250.0

但如果我真的想要精确分位数值,而不是近似值,我如何使用Spark 来实现?
在这里,我有大约 35,000 个城市:我很乐意为Spark 花费时间研究Dataset 的每个值。

【问题讨论】:

    标签: java apache-spark statistics


    【解决方案1】:

    Spark 中的approxQuantile 函数可用于计算精确的分位数。从documentation我们看到有3个参数:

    public double[][] approxQuantile(String[] cols, double[] probabilities, double relativeError)
    

    最后一个是relativeError。这里的描述是:

    relativeError - 要达到的相对目标精度(大于或等于 0)。如果设置为零,则计算精确的分位数,这可能非常昂贵。请注意,接受大于 1 的值,但结果与 1 相同。

    所以您需要做的就是将此参数设置为 0.0。

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      相关资源
      最近更新 更多