如果存储在键中的值匹配,如何在 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的主要内容,如果未能解决你的问题,请参考以下文章