首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符串列包含通过spark scala进行精确匹配的单词

字符串列包含通过spark scala进行精确匹配的单词
EN

Stack Overflow用户
提问于 2021-02-12 14:12:30
回答 3查看 342关注 0票数 0

我有两个数据帧,第一个数据帧包含实际数据(从CSV文件读取),第二个数据帧包含一个具有多个关键字的列。即下面的Dataframe-1外观相似(我们必须搜索的地方):

数据帧-2:

我想要的输出:

我在这里使用spark scala。我想要一个与dataframe-1中的dataframe-2完全匹配的单词。我使用了like、rlike、contains等函数,但它没有给出我想要的输出。有人知道如何在spark scala SQL中或使用dataframe的spark scala函数来开发此逻辑吗?请帮我弄一下这个。

EN

回答 3

Stack Overflow用户

发布于 2021-02-12 14:59:44

您可以通过regexp_replaceRegex条件下拼接两个DataFrames,如下图所示:

代码语言:javascript
复制
val df1 = Seq(
  (1, "Test1", "Amount paid to User1 dt"),
  (2, "Test2", "Amount paid to User1 dt"),
  (3, "Test3", "Amount paid to balamurugan dt"),
  (4, "Test4", "Amount paid to final dt"),
  (5, "Test5", "Amount paid to John less dt")
).toDF("ID", "Name", "Text")

val df2 = Seq("User1", "murugan", "Amo").toDF("Text")

val pattern = concat(lit("\\b"), df2("Text"), lit("\\b"))

df1.join(df2, regexp_replace(df1("Text"), pattern, lit("")) =!= df1("Text")).show
// +---+-----+-----------------------+-----+
// |ID |Name |Text                   |Text |
// +---+-----+-----------------------+-----+
// |1  |Test1|Amount paid to User1 dt|User1|
// |2  |Test2|Amount paid to User1 dt|User1|
// +---+-----+-----------------------+-----+

请注意,\b表示单词边界,因此将正则表达式匹配限制为仅单词匹配。

更新:

正如在其他答案中所建议的那样,left_semi join可能工作得更好,以便在有多个匹配项时避免重复行。如果df2具有要包含在结果数据集中的列,则默认的inner联接将是合适的。

票数 1
EN

Stack Overflow用户

发布于 2021-02-12 15:25:10

您可以根据以下条件进行左半联接: df1 text包含df2 text中的字符串,单词前后各有一个空格:

代码语言:javascript
复制
val result = df1.as("df1").join(
    df2.as("df2"),
    expr("df1.text rlike concat(' ', df2.text, ' ')"),
    "left_semi"
)

result.show(false)
+---+-----+-----------------------+
|ID |Name |Text                   |
+---+-----+-----------------------+
|1  |Test1|Amount paid to User1 dt|
|2  |Test2|Amount paid to User1 dt|
+---+-----+-----------------------+
票数 1
EN

Stack Overflow用户

发布于 2021-02-12 15:29:01

您可以将df1中的Text列拆分为一个单词数组,然后使用array_contains函数进行连接:

代码语言:javascript
复制
val df3 = df1.alias("df1")
  .join(
    df2.alias("df2"),
    array_contains(split(col("df1.Text"), "\\s"), col("df2.Text")),
    "left_semi"
  )

df3.show(false)

//+---+-----+-----------------------+
//|ID |Name |Text                   |
//+---+-----+-----------------------+
//|1  |Test1|Amount paid to User1 dt|
//|2  |Test2|Amount paid to User1 dt|
//+---+-----+-----------------------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66167130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档