一个 RDD 中的值与另一个 RDD 中的值部分/完全匹配

2024-04-14

我有两个 RDD,其中第一个 RDD 具有以下形式的记录

RDD1 = (1, 2017-2-13,"ABX-3354 gsfette"
        2, 2017-3-18,"TYET-3423 asdsad"
        3, 2017-2-09,"TYET-3423 rewriu"
        4, 2017-2-13,"ABX-3354 42324"
        5, 2017-4-01,"TYET-3423 aerr")

第二个 RDD 具有以下形式的记录

RDD2 = ('mfr1',"ABX-3354")
       ('mfr2',"TYET-3423")

我需要找到 RDD1 中与 RDD1 的第三列到 RDD2 的第二列匹配的 RDD2 中每个值具有完全匹配/部分匹配的所有记录,并获取计数

对于此示例,最终结果将是:

ABX-3354  2
TYET-3423 3

做这个的最好方式是什么?


我正在发布几个使用 Spark SQL 的解决方案更专注于准确的模式匹配给定文本中的搜索字符串。

1:使用CrossJoin

import spark.implicits._

val df1 = Seq(
  (1, "2017-2-13", "ABX-3354 gsfette"),
  (2, "2017-3-18", "TYET-3423 asdsad"),
  (3, "2017-2-09", "TYET-3423 rewriu"),
  (4, "2017-2-13", "ABX-335442324"), //changed from "ABX-3354 42324"
  (5, "2017-4-01", "aerrTYET-3423") //changed from "TYET-3423 aerr"
).toDF("id", "dt", "txt")

val df2 = Seq(
  ("mfr1", "ABX-3354"),
  ("mfr2", "TYET-3423")
).toDF("col1", "key")

//match function for filter
def matcher(row: Row): Boolean = row.getAs[String]("txt")
  .contains(row.getAs[String]("key"))

val join = df1.crossJoin(df2)

import org.apache.spark.sql.functions.count

val result = join.filter(matcher _)
  .groupBy("key")
  .agg(count("txt").as("count"))

2:使用广播变量

import spark.implicits._

val df1 = Seq(
  (1, "2017-2-13", "ABX-3354 gsfette"),
  (2, "2017-3-18", "TYET-3423 asdsad"),
  (3, "2017-2-09", "TYET-3423 rewriu"),
  (4, "2017-2-13", "ABX-3354 42324"),
  (5, "2017-4-01", "aerrTYET-3423"),
  (6, "2017-4-01", "aerrYET-3423")
).toDF("id", "dt", "pattern")

//small dataset to broadcast
val df2 = Seq(
  ("mfr1", "ABX-3354"),
  ("mfr2", "TYET-3423")
).map(_._2) // considering only 2 values in pair

//Lookup to use in UDF
val lookup = spark.sparkContext.broadcast(df2)

//Udf
import org.apache.spark.sql.functions._
val matcher = udf((txt: String) => {
  val matches: Seq[String] = lookup.value.filter(txt.contains(_))
  if (matches.size > 0) matches.head else null
})

val result = df1.withColumn("match", matcher($"pattern"))
  .filter($"match".isNotNull) // not interested in non matching records
  .groupBy("match")
  .agg(count("pattern").as("count"))

两种解决方案都会产生相同的输出

result.show()

+---------+-----+
|      key|count|
+---------+-----+
|TYET-3423|    3|
| ABX-3354|    2|
+---------+-----+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个 RDD 中的值与另一个 RDD 中的值部分/完全匹配 的相关文章

随机推荐

  • HighCharts:在一个系列中绘制多个段?

    我问自己是否可以做多条重叠的线 在一个系列中 我找不到任何例子 我不想要这个 Highcharts Highstock 阶梯线没有垂直 过渡 线 https stackoverflow com questions 23242857 high
  • 私有子方法的原型

    我的代码如下所示 var baseClass function CODE var subClass function MORE CODE 向baseClass添加方法就可以了 我只是使用 baseClass prototype newMet
  • 如何从 XML 文档读取值来构建 ComboBox?

    我正在尝试阅读xml questions tagged xml我想为我妈妈制作的文件 所以基本上这就是我想做的 A ComboBox这将显示 XML 中的所有蔬菜名称 选择一种蔬菜后 第二个ComboBox将在 XML 中显示可以使用第一个
  • 如何使用用户环境在 NodeJS 中执行?

    我正在尝试在 Node 中执行命令 cd www foo path to git bin git exe config list global 基本上 我想执行一个返回全局配置 针对当前用户 的 Git 命令 当我直接在 cli 上执行命令
  • 如何在Spritekit中创建计时器?

    我已经弄清楚如何在单视图应用程序中制作计时器 但没有弄清楚 Spritekit 当我使用以下代码时 出现 2 个错误 如下所示 谁能帮我解决这个问题吗 谢谢 杰克 计时器 if scorelabel scorelabel SKLabelNo
  • Session_End 上的 asp.net 会话变量

    我需要访问 global asax cs 中 Session End 事件上的会话变量 但 HttpContext Current 为空 因此所有会话变量都不可访问 a 我可以以不同的方式访问用户会话 或者 b 在 Session End
  • 为什么以 utf-8 保存的文本文件比其他文件大?

    什么是 UTF 8 编码 为什么以 utf 8 格式保存的文本文件比其他格式的文件大 例如 我在记事本中输入 A 并将其保存为 UTF 8 格式 之后 文件大小变为 4字节 Why 几乎可以肯定 因为您用来保存文件的任何内容也包括字节顺序标
  • ISO15693 (NfcV) / Tag-it HF-I 命令引发标签丢失异常

    当我尝试收发 NFC V Tag it HF I Plus Inlay 标签的命令时 大多数命令都会出现 TagLostException 从我经历过的链接来看 这个异常可能是由不正确的命令引起的 如何为 Nfc V Tag it HF I
  • 如何在不使用“~”的情况下从 sass 加载器中的 node_modules 导入样式表

    我正在设置 Storybook 实例以从 Rails 应用程序加载样式 但它无法在我的应用程序中加载导入main scss文件 两者都是样式表node modules import react table react table css i
  • Hibernate JPA 序列(非 Id)

    是否可以对某些列使用数据库序列不是标识符 不是复合标识符的一部分 我使用 hibernate 作为 jpa 提供程序 并且我有一个表 其中有一些生成值的列 使用序列 尽管它们不是标识符的一部分 我想要的是使用序列为实体创建新值 其中序列的列
  • 合并 JSON 数组

    所以我的目标是合并 json 文件以获得以下格式 title NamesBook list name Ajay name Al 我的文件看起来像这样的格式 等等 json title NamesBook list name Ajay blu
  • 如何使用QtCopyDialog?

    我包括这个库 include
  • 如何在Python中检测两个文件是否相同[重复]

    这个问题在这里已经有答案了 在这种情况下 对 md5sum file1 和 md5sum file2 进行系统调用并比较两个返回值是否足够 如果您想做的不仅仅是检测它们是否不同 或者不信任哈希解决方案 标准库中有一些名为difflib ht
  • 我可以将 pandas.dataframe.isin() 与数字容差参数一起使用吗?

    我事先查看了以下帖子 有没有办法将 DataFrame isin 与近似因子或容差值一起使用 或者还有其他方法可以吗 如果列中的值位于一组值列表中 则过滤数据框行 https stackoverflow com questions 1206
  • 网页中的复选框 - 如何使它们更大?

    大多数浏览器中呈现的标准复选框都非常小 即使使用较大的字体也不会增加大小 显示较大复选框的最佳 独立于浏览器的方式是什么 如果这可以帮助任何人 这里有一个简单的 CSS 作为起点 将其变成一个基本的圆角正方形 大到足以容纳拇指 并具有切换的
  • Windows Phone 8 Facebook 身份验证

    我正在开发一个适用于 Windows Phone 8 的应用程序 我想让用户可以使用他们的 Facebook 帐户登录 这样他们就不必在我的应用程序上创建帐户 我看到了 Facebook SDK for NET 并决定使用它 因为它似乎非常
  • Axios:收到两个请求 OPTIONS 和 POST

    我正在尝试发布数据 一切正常 但我不知道为什么我收到两个请求OPTIONS POST POST OPTIONS 这是代码 const url http rest learncode academy api johnbob myusers e
  • 重叠圆的组合面积

    我最近遇到一个问题 我有四个圆 中点和半径 并且必须计算这些圆的并集面积 示例图片 对于两个圆来说 这很容易 我可以计算不在三角形内的每个圆圈面积的分数 然后计算三角形的面积 但是当有两个以上的圆圈时 我可以使用一种聪明的算法吗 找到外周上
  • Java“相当于”CSLA

    我读过该书的好几章CSLA http www lhotka net cslanet 我喜欢这本书 但最近我更倾向于 Java 所以我正在寻找基于 Java 的等效书 有谁知道任何接近的东西Java 中的 CSLA 我还愿意将其他现有技术很好
  • 一个 RDD 中的值与另一个 RDD 中的值部分/完全匹配

    我有两个 RDD 其中第一个 RDD 具有以下形式的记录 RDD1 1 2017 2 13 ABX 3354 gsfette 2 2017 3 18 TYET 3423 asdsad 3 2017 2 09 TYET 3423 rewriu