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

数据帧-2:

我想要的输出:

我在这里使用spark scala。我想要一个与dataframe-1中的dataframe-2完全匹配的单词。我使用了like、rlike、contains等函数,但它没有给出我想要的输出。有人知道如何在spark scala SQL中或使用dataframe的spark scala函数来开发此逻辑吗?请帮我弄一下这个。
发布于 2021-02-12 14:59:44
您可以通过regexp_replace在Regex条件下拼接两个DataFrames,如下图所示:
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联接将是合适的。
发布于 2021-02-12 15:25:10
您可以根据以下条件进行左半联接: df1 text包含df2 text中的字符串,单词前后各有一个空格:
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|
+---+-----+-----------------------+发布于 2021-02-12 15:29:01
您可以将df1中的Text列拆分为一个单词数组,然后使用array_contains函数进行连接:
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|
//+---+-----+-----------------------+https://stackoverflow.com/questions/66167130
复制相似问题