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