Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何基于通配符/正则表达式条件在Spark中连接2个数据帧?_Scala_Apache Spark - Fatal编程技术网

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...|
+--------------------+--------------------+
但是,有一些警告:

  • 模式必须是正确的正则表达式,在前导/尾随通配符的情况下锚定
  • 它使用笛卡尔积()执行:

可以使用我在

中描述的方法筛选候选项存在“魔术”匹配运算符-它被称为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...|
+--------------------+--------------------+
但是,有一些警告:

  • 模式必须是正确的正则表达式,在前导/尾随通配符的情况下锚定
  • 它使用笛卡尔积()执行:


可以使用我在

中描述的方法筛选候选对象。谢谢,我添加了一个额外的步骤,用“.*”替换“*”,并添加锚,这样就可以解决我的问题,就像只针对数据帧一样?除了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连接☹️