Scala 如何基于通配符/正则表达式条件在Spark中连接2个数据帧?
我有两个数据帧Scala 如何基于通配符/正则表达式条件在Spark中连接2个数据帧?,scala,apache-spark,Scala,Apache Spark,我有两个数据帧df1和df2。 假设df1中有一列location,该列可能包含常规URL或带有通配符的URL,例如: stackoverflow.com/questions/* *.cnn.com cnn.com/*/politics 秒数据帧df2具有url字段,该字段可能仅包含不带通配符的有效url 我需要连接这两个数据帧,类似于df1.join(df2,$“location”匹配$“url”)如果连接条件中有magic匹配操作符 在谷歌搜索了一段时间后,我仍然没有找到实现这一目标的方
df1
和df2
。
假设df1
中有一列location
,该列可能包含常规URL或带有通配符的URL,例如:
- stackoverflow.com/questions/*
- *.cnn.com
- cnn.com/*/politics
df2
具有url
字段,该字段可能仅包含不带通配符的有效url
我需要连接这两个数据帧,类似于df1.join(df2,$“location”匹配$“url”)
如果连接条件中有magic匹配
操作符
在谷歌搜索了一段时间后,我仍然没有找到实现这一目标的方法。您将如何解决此类问题?存在“魔法”匹配运算符-它被称为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...|
+--------------------+--------------------+
但是,有一些警告:
- 模式必须是正确的正则表达式,在前导/尾随通配符的情况下锚定
- 它使用笛卡尔积()执行:
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...|
+--------------------+--------------------+
但是,有一些警告:
- 模式必须是正确的正则表达式,在前导/尾随通配符的情况下锚定
- 它使用笛卡尔积()执行:
可以使用我在中描述的方法筛选候选对象。谢谢,我添加了一个额外的步骤,用“.*”替换“*”,并添加锚,这样就可以解决我的问题,就像只针对数据帧一样?除了RDD,你们知道类似的方法吗?提前谢谢你们的回答,这个类似rlike的操作不适用于JavaSpark。另外,当我以functions.col(“url”).rlike(functions.col(“location”)的形式创建联接表达式时,它也会以编程方式给出编译时错误,除了文本值之外。@MahendraKapadne,这是预期的。我故意在这里使用
expr
。没有(Column,Column)=>Column
变量。@user8371915是的,您是正确的,但如果我编写functions.expr(“url rlike location”);然后它编译,但抛出运行时异常。我被困在这里使用java的spark连接☹️谢谢,我添加了一个额外的步骤,用“.*”替换“*”,并添加了锚点,这样就可以解决我的问题,就像只针对数据帧一样?除了RDD,你们知道类似的方法吗?提前谢谢你们的回答,这个类似rlike的操作不适用于JavaSpark。另外,当我以functions.col(“url”).rlike(functions.col(“location”)的形式创建联接表达式时,它也会以编程方式给出编译时错误,除了文本值之外。@MahendraKapadne,这是预期的。我故意在这里使用expr
。没有(Column,Column)=>Column
变量。@user8371915是的,您是正确的,但如果我编写functions.expr(“url rlike location”);然后它编译,但抛出运行时异常。我被困在这里使用java的spark连接☹️