2016-10-05 12 views
0

に変換します。私はAvroスキーマから派生したRDDで変換を行っています。私のアブロクラスは、このようなものになります。値リストの各値のキー/ [値]ペアをキーとしたSparkのRDDを

public class myAvroSchema { 
    public String myKey; 
    public Collection<Value> myValues; 
    public Object someOtherObject; 
} 

を次のように私は、データセットに行ってる現在の変換は次のとおりです。

JavaRDD<myAvroSchema> myResult = AvroRDD.create(mySparkContext); 
myResult.filter(aResult -> !aResult.getmyValues().isEmpty()) 
    .mapToPair(aResult -> Tuple.of(aResult.getKey(), aResult.getMyValues()); 

これは私にJavaRDD<String, Collection<Value>>を与えるが、私が本当にしたいことにありますJavaRDD<String, Value>に戻る

<Key>,Collection<Value>ペアを取得して値を平坦化する方法がわからないので、同じキーを持つ複数の行が存在するようになりましたが、各行には異なる値が設定されています。例えば

、私の結果は、このようなものに見えると言う:私はそれがこのように見えるように変換したい

<KeyA, [Value1, Value2]> 
<KeyB, [Value3, Value4]> 

を:

<KeyA, Value1> 
<KeyA, Value2> 
<KeyB, Value3> 
<KeyB, Value4> 

答えて

0

使用flatMapValues

JavaPairRDD<String, Collection<Value>> immediateResult = myResult.filter(aResult -> !aResult.getmyValues().isEmpty()) 
.mapToPair(aResult -> Tuple.of(aResult.getKey(), aResult.getMyValues()); 
JavaPairRDD<String, Collection<Value>> result = immediateResult.flatMapValues((Collection<Value> x) -> x) 

コードはチェックする可能性なしで書かれました。アイデンティティ関数でflatMapValuesを使用するのは一般的な考え方です。いくつかタイプミスがある場合は、今すぐチェックする可能性はありません。