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



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

  • stackoverflow.com/questions/*
  • *.cnn.com
  • CNN.com/*/政治

秒数据帧df2具有url字段,该字段可能仅包含没有通配符的有效 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...|
+--------------------+--------------------+

但是有一些注意事项:

  • 模式必须是适当的正则表达式,在前导/尾随通配符的情况下锚定。
  • 它是用笛卡尔积执行的(我们如何使用SQL式的"LIKE"标准连接两个Spark SQL数据帧?(:

    == 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]
    

可以使用我在 Apache Spark 中的高效字符串匹配中描述的方法过滤候选

最新更新