gpt4 book ai didi

scala - 如何根据通配符/正则表达式条件在 Spark 中连接 2 个数据帧?

转载 作者:行者123 更新时间:2023-12-03 04:04:20 25 4
gpt4 key购买 nike

我有 2 个数据框 df1df2 。假设有一个location df1 中的专栏其中可能包含常规 URL 或带有通配符的 URL,例如:

  • stackoverflow.com/questions/*
  • *.cnn.com
  • cnn.com/*/politics

秒数据帧 df2url字段只能包含不带通配符的有效 URL。

我需要加入这两个数据框,例如 df1.join(df2, $"location" matches $"url")如果有魔法matches连接条件中的运算符。

经过一番谷歌搜索后,我仍然没有找到实现这一目标的方法。您将如何解决这样的问题?

最佳答案

存在“神奇”匹配运算符 - 它被称为rlike

val df1 = Seq("stackoverflow.com/questions/.*$","^*.cnn.com$", "nn.com/*/politics").toDF("location")
val df2 = Seq("stackoverflow.com/questions/47272330").toDF("url")

df2.join(df1, expr("url rlike location")).show
+--------------------+--------------------+
| url| location|
+--------------------+--------------------+
|stackoverflow.com...|stackoverflow.com...|
+--------------------+--------------------+

但是有一些注意事项:

  • 模式必须是正确的正则表达式,锚定前导/尾随通配符。
  • 它是用笛卡尔积( How can we JOIN two Spark SQL dataframes using a SQL-esque "LIKE" criterion? )执行的:

    == Physical Plan ==
    BroadcastNestedLoopJoin BuildRight, Inner, url#217 RLIKE location#211
    :- *Project [value#215 AS url#217]
    : +- *Filter isnotnull(value#215)
    : +- LocalTableScan [value#215]
    +- BroadcastExchange IdentityBroadcastMode
    +- *Project [value#209 AS location#211]
    +- *Filter isnotnull(value#209)
    +- LocalTableScan [value#209]

可以使用我在Efficient string matching in Apache Spark中描述的方法来过滤候选者。

关于scala - 如何根据通配符/正则表达式条件在 Spark 中连接 2 个数据帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60768160/

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