2

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

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

str是一个字符串,可以是任何东西(除了nullor empty)。

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

4

2 回答 2

4

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

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

str或者如果是一个非平凡的模式本身可以给出意想不到的结果。对于像这样的简单情况,你会更好Column.contains

Seq("[", "foo", " ba.r ").toDF.filter($"value".contains("[")).show
Seq("[", "foo", " ba.r ").toDF.filter($"value".contains("a.r")).show
于 2017-01-20T12:10:17.213 回答
1

您可以使用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|
+------------+---------+

有关更多详细信息,请参阅此帖子

于 2021-01-17T03:57:16.683 回答