【发布时间】:2018-02-20 03:38:36
【问题描述】:
我在 Jupyter (Scala) 笔记本中使用 regexp_extract Spark 2.2 SQL 函数来匹配包含 11 个或更多重复字符的字符串。
这是正则表达式:
^(.)\1{10,}$
现在,让我们用 regexp_extract 函数来看看该模式。以下是我在笔记本中使用它的方式:
spark.sql("SELECT REGEXP_EXTRACT('hhhhhhhhhhhhh', '^(.)\\1{10,}$', 1) as ExtractedChar").show()
+-------------+
|ExtractedChar|
+-------------+
| |
+-------------+
奇怪,没有输出。让我们确保我的正则表达式模式实际上是正确的。 Yep, looks right.
您可能想知道为什么正则表达式模式包含两个“\\”字符,因为它是一个转义字符,所以两个是必需的。以下是一些验证:
1. val string = "SELECT REGEXP_EXTRACT('hhhhhhhhhhhhhhhhhhhhh', '^(.)\\1{10,}$', 1) as ExtractedChar"
2. println(string)
SELECT REGEXP_EXTRACT('hhhhhhhhhhhhhhhhhhhhh', '^(.)\1{10,}$', 1) as ExtractedChar
好的,让我们确保 regexp_extract 函数正常工作:
spark.sqlContext.sql("SELECT REGEXP_EXTRACT('TESTING', '^.', 0) as test").show()
+----+
|test|
+----+
| T|
+----+
好的,也许问题出在 Jupyter 笔记本上?检查并使用 Scala REPL 后,我仍然遇到同样的问题。
任何想法为什么我无法让这个正则表达式成功匹配?
编辑:Spark SQL 是对此的要求。我可以使用 Scala 创建自己的 UDF;但是,UDF 被 Spark 设置为黑盒,这意味着它们不会被完全优化。
【问题讨论】:
-
您不使用scala.util.matching.Regex的任何原因?
-
是的,在这种情况下需要 Spark SQL 才能正确适应我们的过程。我将编辑帖子以包含该内容。
-
不,我的意思是,使用 Scala 对正则表达式做任何你想做的事情,然后将其粘贴到 SQL 查询字符串中。
标签: regex scala apache-spark apache-spark-sql jupyter-notebook