pySpark ค้นหาค่ามัธยฐานแบบกระจายหรือไม่

เป็นไปได้ไหมที่จะหาค่ามัธยฐานของประกายไฟแบบกระจาย? ขณะนี้ฉันกำลังค้นหา: 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)))

ฉันไม่ค่อยแน่ใจว่าจะหาค่ามัธยฐานได้อย่างไร ในการหาค่าเบี่ยงเบนมาตรฐาน ผมก็แค่หาผลลัพธ์เฉพาะที่ด้วยความแปรปรวนของการรูทกำลังสอง เมื่อฉันรวบรวมค่ามัธยฐานแล้วฉันก็สามารถทำ Skewness ในพื้นที่ได้อย่างง่ายดายเช่นกัน

ฉันมีข้อมูลเป็นคู่คีย์/ค่า (คีย์ = คอลัมน์)


person theMadKing    schedule 28.04.2015    source แหล่งที่มา
comment
ดูคำถามนี้ อัลกอริธึมค่ามัธยฐานแบบกระจายที่มีประสิทธิภาพนั้นไม่ตรงไปตรงมา   -  person nrg    schedule 28.04.2015


คำตอบ (1)


สิ่งที่ฉันกำลังดูคือ (ไม่ใช่วิธีที่ดีที่สุด... แต่เป็นวิธีเดียวที่ฉันคิดได้):

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()
person theMadKing    schedule 28.04.2015
comment
เส้น medianRDD = ลงท้ายด้วย .collect() มันตั้งใจหรือเปล่า? คุณได้ทดสอบโซลูชันนี้กับข้อมูลทดสอบเพียงเล็กน้อยหรือไม่ - person Geoffrey Anderson; 08.07.2016
comment
.collect คือการกระทำ และการทำเช่นนี้จะสร้างผลลัพธ์ที่ไม่เป็นอันตรายต่อไดรเวอร์ คุณกังวลอะไร? - person theMadKing; 09.07.2016