我遵循Raju Kumar的PySpark配方,在配方4-5上,我发现当您执行rdd.stats()和rdd.stats()。asDict()时,会得到不同的标准偏差值。这在BTW书中并未引起注意。
这里是重现发现的代码
import pyspark
sc = pyspark.SparkContext()
air_speed = [12,13,15,12,11,12,11]
air_rdd = sc.parallelize(air_speed)
print(air_rdd.stats())
print(air_rdd.stats().asDict())
这是输出
(count: 7, mean: 12.285714285714286, stdev: 1.2777531299998799, max: 15.0, min: 11.0)
{'count': 7, 'mean': 12.285714285714286, 'sum': 86.0, 'min': 11.0, 'max': 15.0, 'stdev': 1.3801311186847085, 'variance': 1.904761904761905}
现在,我知道第一种情况下的标准偏差是“人口”标准偏差公式,第二种情况是总体标准dev的无偏估计量(又称为“样本标准差”)。请参阅an article以供参考。但是我不明白的是为什么它们会从一种输出变为另一种输出,我的意思是.asDict()应该只更改输出的格式,而不是它的含义。
那么,有人知道这种变更的逻辑吗?
我的意思是,看起来.asDict()应该只是更改输出的格式,不是它的意思。
我并没有真正改变意思。 pyspark.statcounter.StatCounter
同时提供sample和population变体
>>> stats = air_rdd.stats()
>>> stats.stdev()
1.2777531299998799
>>> stats.sampleStdev()
1.3801311186847085
并且您可以选择转换成字典时应该使用哪个:
>>> stats.asDict()
{'count': 7, 'mean': 12.285714285714286, 'sum': 86.0, 'min': 11.0, 'max': 15.0, 'stdev': 1.3801311186847085, 'variance': 1.904761904761905}
>>> stats.asDict(sample=True)
{'count': 7, 'mean': 12.285714285714286, 'sum': 86.0, 'min': 11.0, 'max': 15.0, 'stdev': 1.2777531299998799, 'variance': 1.63265306122449}