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

时间:2017-11-13 19:46:06

标签: scala apache-spark

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

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

秒数据框df2包含url字段,该字段可能只包含没有通配符的有效网址。

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

经过一些谷歌搜索后,我仍然没有看到如何实现这一目标的方法。你会如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

存在“魔术”匹配运算符 - 它被称为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

中描述的方法I过滤候选者