我希望在列上应用“rlike”函数,但是我希望能够输入列(这是一个正则表达式字符串),而不是标准正则表达式字符串。
即。
$col1.rlike($col2)
其中 $col2 在数据框中采用正则表达式格式
我尝试过应用UDF:
def rLike = udf((s: String, col: Column) => col.rlike(s))
这一直给我错误:
java.lang.UnsupportedOperationException:不支持 org.apache.spark.sql.Column 类型的架构
任何人都可以告诉我如何解决这个问题吗?
rlike
不支持存储在 Column
中的正则表达式匹配模式。另一种方法是使用 regexp_replace
,如下所示:
import org.apache.spark.sql.functions._
import spark.implicits._
val df = Seq(
("a123", "[a-z]\\d+"),
("b456", "[a-z]+")
).toDF("text", "pattern")
val matched = "Matched!" // can be any value non-existent in column `text`
df.where(regexp_replace($"text", $"pattern", lit(matched)) === matched).show
// +----+--------+
// |text| pattern|
// +----+--------+
// |a123|[a-z]\d+|
// +----+--------+
如果您想将自定义
rlike
实现为 UDF(与本机 Spark API 函数相比,它通常无法很好地扩展),这里有一种方法:
def rlike = udf( (text: String, pattern: String) => text match {
case pattern.r() => true
case _ => false
} )
// Applying the UDF
df.where(rlike($"text", $"pattern"))
原来的问题在评论中得到了回答:UDF需要通过签名来实现
(s: String, col: String): Boolean
对于任何其他偶然发现这个问题的人 - 在不使用 UDF 的情况下,我现在能找到的唯一半干净的方法是使用
expr
函数。
df.where(expr("col1 RLIKE col2"))
我发现一个 Jira 问题(SPARK-11366)请求诸如
rlike
之类的功能来接受其他列,但它似乎已关闭而没有更新。