Spark 2.2 / Jupyter Notebook SQL regexp_extract函数与正则表达式模式不匹配

lem*_*ter 2 regex scala apache-spark apache-spark-sql jupyter-notebook

我在Jupyter(Scala)笔记本中使用regexp_extract Spark 2.2 SQL函数来匹配包含11个或更多重复字符的字符串。

这是正则表达式:

^(.)\1{10,}$
Run Code Online (Sandbox Code Playgroud)

现在,让我们用regexp_extract函数查看该模式。这是我在笔记本中使用它的方式:

spark.sql("SELECT REGEXP_EXTRACT('hhhhhhhhhhhhh', '^(.)\\1{10,}$', 1) as ExtractedChar").show()

+-------------+
|ExtractedChar|
+-------------+
|             |
+-------------+
Run Code Online (Sandbox Code Playgroud)

奇怪,没有输出。让我们确保我的regex模式是正确的。是的,看起来不错。

您可能想知道为什么正则表达式模式包含两个“ \\”字符,这是因为它是一个转义字符,所以两个是必需的。这是一些验证:

1. val string = "SELECT REGEXP_EXTRACT('hhhhhhhhhhhhhhhhhhhhh', '^(.)\\1{10,}$', 1) as ExtractedChar"
2. println(string)
SELECT REGEXP_EXTRACT('hhhhhhhhhhhhhhhhhhhhh', '^(.)\1{10,}$', 1) as ExtractedChar
Run Code Online (Sandbox Code Playgroud)

好吧,让我们确保regexp_extract函数正常工作:

spark.sqlContext.sql("SELECT REGEXP_EXTRACT('TESTING', '^.', 0) as test").show()
+----+
|test|
+----+
|   T|
+----+
Run Code Online (Sandbox Code Playgroud)

好吧,也许问题是Jupyter笔记本?检查并使用Scala REPL之后,我仍然遇到相同的问题。

有什么想法为什么我无法使此正则表达式成功匹配吗?

编辑:Spark SQL是对此的要求。我可以使用Scala创建自己的UDF;但是,UDF用Spark装黑盒,这意味着它们不会得到完全优化。

lem*_*ter 5

我找到了解决方案。SQL字符串需要包含4个“ \”字符,如下所示:

'^(.)\\\\1{10,}$'
Run Code Online (Sandbox Code Playgroud)