Apache spark Spark API:在LIKE语句中使用列值

Apache spark Spark API:在LIKE语句中使用列值,apache-spark,apache-spark-sql,sparkapi,Apache Spark,Apache Spark Sql,Sparkapi,在spark API中: column.like("only takes a static string with optional wildcards like %") column.contains(accepts_a_column_but_wont_parse_wildcards) 那么,调用什么等效方法来比较使用通配符的值,这些通配符可能出现在连接中找到的列的字符串值中 由于like接受文本字符串而不是列而失败的示例: .join(other_df, column.like(conca

在spark API中:

column.like("only takes a static string with optional wildcards like %")
column.contains(accepts_a_column_but_wont_parse_wildcards)
那么,调用什么等效方法来比较使用通配符的值,这些通配符可能出现在连接中找到的列的字符串值中

由于like接受文本字符串而不是列而失败的示例:

.join(other_df, column.like(concat("%", $"column_potentially_with_wildcards", "%")), "left")
查看代码,like似乎只接受文本值作为方便。希望他们能在将来的版本中对此进行扩展,但现在您可以创建自己的函数来补偿:

import org.apache.spark.sql.catalyst.expressions.Like
import org.apache.spark.sql.Column

def columnLike(a : Column, b : Column) : Column = new Column( Like(a.expr, b.expr))


美好的实际上,我用.joindTojoin、exprcol_a LIKE CONCAT“%”、fuzzy_matching_col、“%”解决了这个问题。为什么我不必注册isLike作为UDF来使用它呢?哦,很好的一个-我的第一反应是将fuzzy_matching_col中的SQL通配符转换为Java正则表达式,并使用regexp_extract作为伪类。我很好奇是否有任何表现或计划上的差异。我对Spark UDF没有太多的经验,但据我所知,它们似乎将在常规语言类型long等上运行的函数转换为在列上工作。因为我的函数是Columns-in,Columns-out,所以没有必要。奖励:我的答案是一行:df1.joindf2,新的columnedlikedf1value.expr,df2value.expr.show
scala> val df1 = List("aaaa", "bbbb", "aaaabbbbcccc", "abcd", "abc").toDS()
df1: org.apache.spark.sql.Dataset[String] = [value: string]

scala> val df2 = List("a%b%c").toDS()
df2: org.apache.spark.sql.Dataset[String] = [value: string]

scala> df1.join(df2, columnLike(df1("value"), df2("value"))).show
+------------+-----+                                                            
|       value|value|
+------------+-----+
|aaaabbbbcccc|a%b%c|
|         abc|a%b%c|
+------------+-----+