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

时间:2017-01-20 05:33:17

标签: scala apache-spark apache-spark-sql rlike

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

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

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

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

2 个答案:

答案 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