2016-05-02 22 views
1

私はエレガントな方法でアプローチする方法がわからないという問題に直面しています。Spark/Scala - リストのRDDでkeyByを使用する[Int、Double]

First - RDD[(Int, Double)] 
Second - RDD[MyObject, List[(Int, Double)]) 

私はこれらの2 RDDのキーとしてIntを使用して参加する必要があります:私は、私が参加する必要があることを2 RDDのを持っています。最初のRDDでは、Intを使用してkeyByを定義できますが、2番目のRDDでkeyByをどのように定義できますか?私の結果として得られたRDDは、以下の構造を持たなければなりません RDD[MyObject, Int, Double]ここで、Doubleは、Int keyで結合された後の2 Doubleの乗算結果です。 2つのネストされたループでより洗練されたソリューションを探して解決できることを理解しています。

答えて

3

使用flatMap

val first: RDD[(Int, Double)] = // ... 
val second: RDD[T, List[(Int, Double)]) = // ... 

val flattened: RDD[(Int, (T, Double))] = second.flatMap { case (t, list) => 
    list.map { case (i, d) => (i, (t, d)) } 
} 

val joined: RDD[(Int, (Double, (T, Double)))] = first.join(flattened) 
val multiplied: RDD[(T, Int, Double)] = joined.map { case (i, (d1, (t, d2))) => 
    (t, i, d1 * d2) 
} 
関連する問題