2017-12-05 10 views
-1

シンプルなプログラムを作成して、ドライバが記録した時間とマイルの合計を求めようとしています。私は今のようにgroupByKeyとRDDの外観を適用しました。Spark RDD Iiterableから2つの要素の合計を取得する方法

(13,CompactBuffer((49,2643), (56,2553), (60,2539), (55,2553), (45,2762), (53,2699), (46,2519), (60,2719), (56,2760), (51,2731), (57,2671), (47,2604), (58,2510), (51,2649), (56,2559), (59,2604), (47,2613), (49,2585), (58,2749), (50,2756), (57,2596), (54,2517), (48,2554), (47,2576), (58,2528), (60,2765), (54,2689), (51,2739), (51,2698), (47,2739), (51,2546), (54,2647), (60,2504), (48,2536), (51,2602), (47,2651), (53,2545), (48,2665), (55,2670), (60,2524), (48,2612), (60,2712), (60,2583), (47,2773), (57,2589), (51,2512), (57,2607), (57,2576), (53,2604), (59,2702), (51,2687), (10,100))) 

2つの要素の合計を得るのに便利なスカラ関数を教えてください。ありがとう!!

+0

から返されます。groupByKeyの代わりにaggregateByKey変換を使用してください。 –

答えて

0

私が正しくあなたの質問を理解していれば、ここに集約時間とマイルにgroupByKeymapValuesreduceを使用して一つのアプローチです:

val rdd = sc.parallelize(Seq(
    (13, (49,2643)), 
    (13, (56,2553)), 
    (13, (60,2539)), 
    (14, (40,1500)), 
    (14, (50,2500)) 
)) 

rdd.groupByKey.mapValues(_.reduce((a, x) => (a._1 + x._1, a._2 + x._2))) 
// res1: Array[(Int, (Int, Int))] = Array((13,(165,7735)), (14,(90,4000))) 

それとも、必要がない場合は、直接reduceByKeyを使用してコメンター、集計によって指摘としては、中間結果はgroupByKeyから

rdd.reduceByKey((a, x) => (a._1 + x._1, a._2 + x._2)) 
+0

'reduceByKey'を使うことができます:' rdd.reduceByKey {(a、b)=>(a._1 + b._1、a._2 + b._2)} ' – philantrovert

+0

@philantrovert。私は、OPがすでに適用していたものにちょうど従って、より良い選択肢を提案するのを怠った。回答が更新されました。 –