如果存储在键中的值匹配,如何在 Spark 中合并两个 RDD

Posted

技术标签:

【中文标题】如果存储在键中的值匹配,如何在 Spark 中合并两个 RDD【英文标题】:How to merge two RDDs in Spark if value stored at a key matches 【发布时间】:2016-07-06 18:04:57 【问题描述】:

假设我有 2 个RDDs:

rdd1 = [ (key1, value1), (key2, value2), (key3, value3) ]

rdd2 = [ (key4, value4), (key5, value5), (key6, value6) ]

当且仅当存储在 rdd1 中 key1 的值 == 存储在 rdd2 中 key5 的值时,我想合并 rdds。

我将如何使用 Java 或 Scala 在 Spark 中执行此操作?

【问题讨论】:

【参考方案1】:

我认为您正在寻找加入。

您需要做的第一件事是将它们映射到 PairRDD,其中 key1、key2 等作为键。此示例使用 Tuple2 作为输入:

JavaPairRDD<Integer, String> pairRdd = rdd.mapToPair(new PairFunction<Tuple2<Integer, String>, Integer, String>() 
    public Tuple2<Integer, String> call(Tuple2<Integer, String> val) throws Exception 
        return new Tuple2<Integer, String>(val._1(), val._2());
    
);

一旦你映射了两者,你只需要按键加入它们:

JavaPairRDD<Integer, Tuple2<String, String>> combined = pairRdd.join(pairRdd2);

然后,组合将是这样的:

[ (key1, (value1, value5)), (key2, (value2, value4)) ]

其中 key1 == key5 和 key2 == key4

【讨论】:

【参考方案2】:

我给你下面的scala spark解决方案

scala> val rdd1 = sc.parallelize(List((3,"s"),(2,"df"),(1,"i")))
scala> val rdd2 = sc.parallelize(List((1,"ds"),(2,"h"),(1,"i")))
scala> val swaprdd1=rdd1.map(_.swap)
scala> val swaprdd2=rdd2.map(_.swap)
scala> val intersectrdd = rdd1.intersection(rdd2)
scala> val resultrdd = intersectrdd.map(_.swap)

我希望它对您的解决方案有所帮助:)

【讨论】:

以上是关于如果存储在键中的值匹配,如何在 Spark 中合并两个 RDD的主要内容,如果未能解决你的问题,请参考以下文章

如何将json字符串转换为字典并在键中保存顺序? [复制]

如何在数组元素中搜索哈希键中的匹配项

使用 mongoose 插入 MongoDB 时在键中使用“@”

如何将两个表与键中的日期合并(Python)

按值对HashMap进行排序[重复]

如何在 Swift 上的 Firebase 中获取嵌套键中的值