【问题标题】:Turn RDD in Spark with key/[value] pairs into key/value pairs for each value in the values list将 Spark 中的 RDD 与键/[值] 对转换为值列表中每个值的键/值对
【发布时间】:2023-04-10 00:34:01
【问题描述】:

我正在对从 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&lt;String, Collection&lt;Value&gt;&gt;,但我真正想要的是返回JavaRDD&lt;String, Value&gt;

我不知道如何获取我的 &lt;Key&gt;,Collection&lt;Value&gt; 对并将值展平,以便现在有多行具有相同的键,但每行的值不同。

例如,假设我的结果如下所示:

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

我想把它改成这样:

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

【问题讨论】:

    标签: java apache-spark mapreduce rdd


    【解决方案1】:

    使用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 与标识函数一起使用只是一般的想法。如果有错别字 - 抱歉,我现在无法检查

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 2016-06-24
      • 2023-03-21
      相关资源
      最近更新 更多