在 org.apache.spark.sql.Column 中使用 rlike
Using rlike in org.apache.spark.sql.Column
我正在尝试在我的 Scala 代码中实现一个查询,该代码使用 Spark Column
上的正则表达式来查找列中包含特定值的所有行,例如:
column.rlike(".*" + str + ".*")
str
是一个字符串,可以是任何内容(null
或 empty
除外)。
这适用于我正在测试的基本查询。然而,作为 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。
我正在尝试在我的 Scala 代码中实现一个查询,该代码使用 Spark Column
上的正则表达式来查找列中包含特定值的所有行,例如:
column.rlike(".*" + str + ".*")
str
是一个字符串,可以是任何内容(null
或 empty
除外)。
这适用于我正在测试的基本查询。然而,作为 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。