为了计算分位数,我使用从任何approxQuantile
或stat()
的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/