gpt4 book ai didi

scala - 一个 RDD 中的部分/完全匹配值到另一个 RDD 中的值

转载 作者:行者123 更新时间:2023-12-05 00:14:52 25 4
gpt4 key购买 nike

我有两个 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 中的所有记录,这些记录与 RDD2 中的每个值完全匹配/部分匹配,匹配 RDD1 的第 3 列到 RDD2 的第 2 列并获取计数

对于此示例,最终结果将是:
ABX-3354  2
TYET-3423 3

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

最佳答案

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

1:使用交叉连接

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|
+---------+-----+

关于scala - 一个 RDD 中的部分/完全匹配值到另一个 RDD 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45911993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com