我希望在列上应用'rlike‘函数,但是,我希望能够输入一个列(这是一个正则表达式字符串),而不是一个标准的正则表达式字符串。
即。$col1.rlike($col2),其中$col2是数据格式中的正则表达式格式。
我尝试过应用UDF:def rLike = udf((s: String, col: Column) => col.rlike(s))
这给了我一个错误:
java.lang.UnsupportedOperationException:不支持org.apache.spark.sql.Column类型的架构
有谁能说明一下我是怎么解决这个问题的。
发布于 2019-07-31 01:51:44
方法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函数相比,UDF通常不能很好地扩展),下面有一种方法:
def rlike = udf( (text: String, pattern: String) => text match {
case pattern.r() => true
case _ => false
} )
// Applying the UDF
df.where(rlike($"text", $"pattern"))https://stackoverflow.com/questions/57281738
复制相似问题