我有2个数据框df1
和df2
。
假设location
中有df1
列,其中可能包含常规网址或带通配符的网址,例如:
秒数据框df2
包含url
字段,该字段可能只包含没有通配符的有效网址。
如果在加入条件中有魔术df1.join(df2, $"location" matches $"url")
运算符,我需要加入这两个数据框,如matches
。
经过一些谷歌搜索后,我仍然没有看到如何实现这一目标的方法。你会如何解决这个问题?
答案 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]