pySpark以分布式方式找到中位数?
pySpark find Median in a distributed way?
是否有可能以分布式方式在 spark 中找到中位数?我目前发现:Sum
、Average
、Variance
、Count
使用以下代码:
dataSumsRdd = numRDD.filter(lambda x: filterNum(x[1])).map(lambda line: (line[0], float(line[1])))\
.aggregateByKey((0.0, 0.0, 0.0),
lambda (sum, sum2, count), value: (sum + value, sum2 + value**2, count+1.0),
lambda (suma, sum2a, counta), (sumb, sum2b, countb): (suma + sumb, sum2a + sum2b, counta + countb))
#Generate RDD of Count, Sum, Average, Variance
dataStatsRdd = dataSumsRdd.mapValues(lambda (sum, sum2, count) : (count, sum, sum/count, round(sum2/count - (sum/count)**2, 7)))
虽然我不太确定如何找到中位数。为了找到标准偏差,我只是在本地用平方根方差计算结果。一旦我收集到中位数,我就可以轻松地在本地进行偏度计算。
我的数据是 Key/Value 对(键 = 列)
我正在看的是(这不是最好的方法......但我能想到的唯一方法):
def medianFunction(x):
count = len(x)
if count % 2 == 0:
l = count / 2 - 1
r = l + 1
value = (x[l - 1] + x[r - 1]) / 2
return value
else:
l = count / 2
value = x[l - 1]
return value
medianRDD = numFilterRDD.groupByKey().map(lambda (x, y): (x, list(y))).mapValues(lambda x: medianFunction(x)).collect()
是否有可能以分布式方式在 spark 中找到中位数?我目前发现:Sum
、Average
、Variance
、Count
使用以下代码:
dataSumsRdd = numRDD.filter(lambda x: filterNum(x[1])).map(lambda line: (line[0], float(line[1])))\
.aggregateByKey((0.0, 0.0, 0.0),
lambda (sum, sum2, count), value: (sum + value, sum2 + value**2, count+1.0),
lambda (suma, sum2a, counta), (sumb, sum2b, countb): (suma + sumb, sum2a + sum2b, counta + countb))
#Generate RDD of Count, Sum, Average, Variance
dataStatsRdd = dataSumsRdd.mapValues(lambda (sum, sum2, count) : (count, sum, sum/count, round(sum2/count - (sum/count)**2, 7)))
虽然我不太确定如何找到中位数。为了找到标准偏差,我只是在本地用平方根方差计算结果。一旦我收集到中位数,我就可以轻松地在本地进行偏度计算。
我的数据是 Key/Value 对(键 = 列)
我正在看的是(这不是最好的方法......但我能想到的唯一方法):
def medianFunction(x):
count = len(x)
if count % 2 == 0:
l = count / 2 - 1
r = l + 1
value = (x[l - 1] + x[r - 1]) / 2
return value
else:
l = count / 2
value = x[l - 1]
return value
medianRDD = numFilterRDD.groupByKey().map(lambda (x, y): (x, list(y))).mapValues(lambda x: medianFunction(x)).collect()