2017-02-20 13 views
1

employee.txt:ロジック

100|Surender 
101|Raja 

salary.txt:

100|2016-JAN|15000 
100|2016-FEB|15000 

こんにちは

私はいくつかをやっていますスカラを使ったスパークコアでの基本的なハンズオン。

各従業員の合計給与を計算する必要があります。従業員が給与ファイルに一致するレコードを持っていない場合、給与を0として表示

私は以下のコードを試しました。私は参加するまで行くことができましたが、私は誰も読んでいないし、何かを読んでさらに進むことができないのですか?

期待される出力に手伝ってくれますか?

scala> val empRDD = sc.textFile("/user/cloudera/inputfiles/employee.txt") 
scala> val salaryRDD = sc.textFile("/user/cloudera/inputfiles/salary.txt") 
scala> val empMapRDD = empRDD.map(elem => elem.split("\\|")) 
scala> val salaryMapRDD = salaryRDD.map(elem => elem.split("\\|")) 
scala> val empKeyValueRDD = empMapRDD.map(elem => (elem(0),elem(1)) 
scala> val salaryKeyValueRDD = salaryMapRDD.map(elem => (elem(0),elem(2))) 
scala> val joinedRDD = empKeyValueRDD.leftOuterJoin(salaryKeyValueRDD) 
scala> joinedRDD.collect 
res3: Array[(String, (String, Option[String]))] = Array((101,(Raja,None)), (100,(Surender,Some(15000))), (100,(Surender,Some(15000)))) 

予想される出力:

Array((100,Surender,30000), (101,Raja,0)) 

答えて

1
val joinedRDD = empKeyValueRDD.leftOuterJoin(salaryKeyValueRDD) 
    .groupBy(x => (x._1, x._2._1)) 
    .map(r => { 
    val sal = r._2.map(x => x._2._2 match { 
     case None => 0 
     case Some(num) => num.toLong 
    }).sum 

    (r._1._1, r._1._2, sal) 
    }) 

    println(joinedRDD.collect.toList) 
    //List((100,Surender,30000), (101,Raja,0)) 

groupBy(x => (x._1, x._2._1))後の中間データがこの

List(
    ((100,Surender),CompactBuffer(
    (100,(Surender,Some(15000))), 
    (100,(Surender,Some(15000)))) 
), 
    ((101,Raja),CompactBuffer(
    (101,(Raja,None))) 
) 
) 
+0

おかげで多くのSriniようになります、同じ結果を達成するために、他のいくつかの方法がある場合は私に知らせてください。 –

0

私は、コードの以下のスタイルを試してみましたが、私は結果

... 
scala> joinedRDD.map(elem => ((elem._1, elem._2._1),elem._2._2 match { case Some(i) => i.toInt case None => 0 })).reduceByKey((x,y) => x+y).map(elem => (elem._1._1,elem._1._2,elem._2)).collect 

出力ました:

Array[(String, String, Int)] = Array((100,Surender,30000), (101,Raja,0))