我正在尝试在我的Scala代码中实现一个查询,该代码使用Spark Column
上的regexp来查找列中包含特定值的所有行,如:
column.rlike(".*" + str + ".*")
str
是一个字符串,可以是任何字符串(null
或empty
除外)。
这适用于我正在测试的基本查询。然而,作为Spark / Scala的新手,我不确定是否有任何特殊情况可能会破坏我需要处理的代码。我需要逃避任何角色或特殊情况吗?
答案 0 :(得分:2)
这可以通过任何无效的正则表达式来解决。你甚至不必努力:
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
答案 1 :(得分:0)
您可以使用 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。