Apache Spark 在一个RDD中查找元素,但在另一个RDD中不查找

rjjhvcjd  于 2022-11-16  发布在  Apache
关注(0)|答案(2)|浏览(144)

我有两个JavaRDD A和B。我想只保留A中的long,而不保留B中的long。我该怎么做呢?谢谢!

nr7wwzry

nr7wwzry1#

我正在发布一个用scala编写的解决方案。在Java中应该差不多。
执行一个leftOuterJoin,它将给予第一个rdd中的所有记录以及第二个rdd中的匹配记录。就像WrappedArray((168,(def,None)), (192,(abc,Some(abc))))一样。但是为了使记录只出现在第一个rdd中,我们对None应用了一个过滤器。

val data = spark.sparkContext.parallelize(Seq((192, "abc"),(168, "def")))
val data2 = spark.sparkContext.parallelize(Seq((192, "abc")))

val result = data
.leftOuterJoin(data2)
.filter(record => record._2._2 == None)

println(result.collect.toSeq)
Output> WrappedArray((168,(def,None)))
w46czmvw

w46czmvw2#

如果你使用Dataframe API - RDD是旧的,没有很多钨引擎的优化-你可以使用一个antijoin(它也可以存在于RDD API上,但让我们使用好的一个;- -))

val dataA = Seq((192, "abc"),(168, "def") ).toDF("MyLong", "MyString")
val dataB = Seq((192, "abc")).toDF.toDF("MyLong", "MyString")

dataA.join(dataB, Seq("MyLong"), "leftanti").show(false)

+------+--------+
|MyLong|MyString|
+------+--------+
|168   |def     |
+------+--------+

相关问题