我有 2 个数据帧df1
和 df2
.假设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 中的高效字符串匹配中描述的方法过滤候选