首页 > 解决方案 > 在正则表达式列上应用“rlike”?

问题描述

我希望在列上应用“rlike”函数,但是我希望能够输入一列(这是一个正则表达式字符串),而不是标准的正则表达式字符串。

IE。$col1.rlike($col2) 其中 $col2 在数据框中采用正则表达式格式

我尝试过应用 UDF: def rLike = udf((s: String, col: Column) => col.rlike(s))

这一直给我错误:

java.lang.UnsupportedOperationException:不支持 org.apache.spark.sql.Column 类型的架构

谁能告诉我如何解决这个问题。

标签: regexscalaapache-spark

解决方案


方法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"))

推荐阅读