使用键/ [值]对将Spark中的RDD转换为值列表中每个值的键/值对

时间:2016-10-05 14:00:10

标签: java apache-spark mapreduce rdd

我正在对从Avro Schema派生的RDD进行转换。我的Avro课程看起来像这样:

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>

1 个答案:

答案 0 :(得分: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是一般的想法。如果有一些拼写错误 - 抱歉,我现在无法检查