为了计算分位数,我使用从任何approxQuantilestat()Dataset函数中的Dataframe函数可访问的Spark方法。近似它们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的每个值。

最佳答案

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


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



最后一个是relativeError。这里的说明说:


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


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

关于java - 确切的分位数还是Spark中的近似分位数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58055807/

10-12 02:54