【问题标题】:Spark 2.2/Jupyter Notebook SQL regexp_extract function not matching regex patternSpark 2.2/Jupyter Notebook SQL regexp_extract 函数与正则表达式模式不匹配
【发布时间】: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


【解决方案1】:

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

'^(.)\\\\1{10,}$'

【讨论】:

  • 它有效,但有任何文档来解释为什么这是必要的吗?
  • @mohit:相同的查询在 hive 中使用 2 个反斜杠,但在 spark sql 中它使用 4 个反斜杠.. 有趣
【解决方案2】:

正如here 所解释的,需要四个\ 字符,因为\ 有两个原因:

  1. \是SQL中的特殊字符,需要转义,所以查询需要两个。
  2. 输入来自一个字符串,其中\ 也需要转义。仅仅拥有"\\" 就会得到一个\。要获得两个,您需要"\\\\"

【讨论】:

    猜你喜欢
    • 2019-10-08
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多