我的RDD為(key, (val1,val2))。為此rdd,我想應用reduceByKey函數,我的要求是val2針對單個鍵找到的最小值,并提取val1結果的最小值val2。例如:(1,(a,4)),(2,(b,3)),(1,(c,2)),(2,(d,1)) 在此,我希望結果集為(1,(c,2)),(2,(d,1))我在python代碼下面有想法,但是在這里我得到了第一個val1,而不是val1與minimum對應的代碼val2。rdd2 = rdd1.map(lambda x:(x[0],(x[1],x[3])))rdd3 = rdd2.reduceByKey(lambda x,y:(x[0],min(x[1],y[1])))請幫助我修改代碼,以便獲得所需的結果。
3 回答

一只斗牛犬
TA貢獻1784條經驗 獲得超2個贊
你需要的一切都if else在reduceByKey功能
rdd3 = rdd2.reduceByKey(lambda x, y: x if(x[1] < y[1]) else y)
這應該給你你想要的輸出為
#(1, ('c', 2))
#(2, ('d', 1))
我希望答案是有幫助的

莫回無
TA貢獻1865條經驗 獲得超7個贊
在這里,我將通過使用scala獲得所需的結果,因為我現在已經學到了更多scala,所以我現在可以回答我自己的問題,如下所示:
val list = List((1,('a',4)),(2,('b',3)),(1,('c',2)),(2,('d',1)))
val rdd = sc.parallelize(list)
rdd.reduceByKey((rec1,rec2) => if(rec1._2 > rec2._2) rec2 else rec1).foreach(println)
輸出:
(2,(d,1))
(1,(c,2))
我在這里提到了此代碼,因為其他人可以參考并發現它很有用。謝謝...

慕尼黑的夜晚無繁華
TA貢獻1864條經驗 獲得超6個贊
min與key參數一起使用:
from functools import partial
from operator import itemgetter
rdd.reduceByKey(partial(min, key=itemgetter(1)))
添加回答
舉報
0/150
提交
取消