在 org.apache.spark.sql.Column 中使用 rlike

Using rlike in org.apache.spark.sql.Column

我正在尝试在我的 Scala 代码中实现一个查询,该代码使用 Spark Column 上的正则表达式来查找列中包含特定值的所有行,例如:

 column.rlike(".*" + str + ".*")

str 是一个字符串,可以是任何内容(nullempty 除外)。

这适用于我正在测试的基本查询。然而,作为 Spark / Scala 的新手,我不确定是否有任何特殊情况可能会破坏我需要处理的代码。有没有我需要转义的字符或我需要担心的特殊情况?

这可以被任何无效的正则表达式破坏。你甚至不必努力:

Seq("[", "foo", " ba.r ").toDF.filter($"value".rlike(".*" + "[ " + ".*")).show

or 如果 str 是一个 non-trivial 模式本身,可能会产生意想不到的结果。对于像这样的简单情况,使用 Column.contains:

会更好
Seq("[", "foo", " ba.r ").toDF.filter($"value".contains("[")).show
Seq("[", "foo", " ba.r ").toDF.filter($"value".contains("a.r")).show

您可以使用 rlike 作为零建议和 Pattern.quote 来处理特殊的正则表达式字符。假设你有这个 DF:

val df = Seq(
  ("hel?.o"),
  ("bbhel?.o"),
  ("hel?.oZZ"),
  ("bye")
).toDF("weird_string")

df.show()
+------------+
|weird_string|
+------------+
|      hel?.o|
|    bbhel?.o|
|    hel?.oZZ|
|         bye|
+------------+

以下是查找包含 "hel?.o".

的所有字符串的方法
import java.util.regex.Pattern

df
  .withColumn("has_hello", $"weird_string".rlike(Pattern.quote("hel?.o")))
  .show()
+------------+---------+
|weird_string|has_hello|
+------------+---------+
|      hel?.o|     true|
|    bbhel?.o|     true|
|    hel?.oZZ|     true|
|         bye|    false|
+------------+---------+

您也可以手动添加引号字符以获得相同的结果:

df
  .withColumn("has_hello", $"weird_string".rlike("""\Qhel?.o\E"""))
  .show()

如果你没有正确地转义正则表达式,你将不会得到正确的结果:

df
  .withColumn("has_hello", $"weird_string".rlike("hel?.o"))
  .show()
+------------+---------+
|weird_string|has_hello|
+------------+---------+
|      hel?.o|    false|
|    bbhel?.o|    false|
|    hel?.oZZ|    false|
|         bye|    false|
+------------+---------+

有关详细信息,请参阅 this post