Apache Spark - 如何从两个 RDD 中获取不匹配的行

Posted

技术标签:

【中文标题】Apache Spark - 如何从两个 RDD 中获取不匹配的行【英文标题】:Apache Spark - how to get unmatched rows from two RDDs 【发布时间】:2015-07-01 11:01:30 【问题描述】:

我有两个不同的 RDD,每个 RDD 都有一些公共字段,基于这些字段我想从 RDD1 或 RDD2 中获取不匹配的记录。[RDD1 中可用的记录但 RDD2 中不可用的记录] [RDD2 中可用但不可用的记录在 RDD1]

看来我们可以使用subtractsubtractbyKey

示例输入:

**File 1:**

sam,23,cricket
alex,34,football
ann,21,football

**File 2:**

ruby,25,football,usa
alex,34,cricket,usa
ann,21,cricket,usa

**expected output:**

sam,23,cricket

更新:

目前我正在使用 Spark SQL 从 RDD 中获取不匹配的记录(编写查询以获取不匹配的记录)。

我正在寻找的是,我们是否可以使用 Spark Core 本身而不是使用 Spark SQL 来完成它,而且我没有查看代码,Spark Core 中是否有任何可用的操作?

请就此提出建议。

问候, 尚卡尔。

【问题讨论】:

一些例子?你试过什么了?还是您只是希望有人会为您编写代码? :) @SilverSkin 我更新了我的问题。感谢您的评论。 您能否添加一些示例数据和预期结果? @maasg 添加了示例数据.. 谢谢 【参考方案1】:

您可以将两个 RDD 设置为相同的形状并使用 subtract 删除公共元素。

鉴于上面提到的file1 中的rdd1file2 中的rdd2,您可以执行以下操作:

val userScore2 = rdd2.mapcase (name, score, sport, country) => (name, score, sport)

val in1andNotin2 = rdd1 subtract userScore2

val in2andNotIn1 = userScore2 subtract rdd1

【讨论】:

谢谢我知道了。我会尝试在 java API 上做同样的事情。

以上是关于Apache Spark - 如何从两个 RDD 中获取不匹配的行的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Apache Spark 中的单个文件记录创建多个 RDD 行

使用 Scala 在 Apache Spark 中连接不同 RDD 的数据集

使用两个 RDD apache spark

如何将 cassandraRow 转换为 Row(apache spark)?

如何在 Apache Spark 中跨列创建 RDD 分区?

将 RDD 转换为 Dataframe Spark