Spark 2.2/Jupyter笔记本SQL REGEXP_EXTRACT功能与REGEX模式不匹配



我正在使用regexp_extract spark 2.2 jupyter(scala)笔记本中的sql函数,以匹配11个或更多重复字符的字符串。

这是正则:

^(.)1{10,}$

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

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

奇数,没有输出。让我们确保我的正则表达式实际上是正确的。是的,看起来对。

您可能想知道为什么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

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

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

好吧,也许问题是jupyter笔记本?检查和使用Scala repl后,我仍然遇到同样的问题。

有什么想法,为什么我无法成功匹配这条正则是?

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

我找到了解决方案。SQL字符串需要包括4个" "字符,例如:

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

如下所述,需要四个字符,因为的原因有两个:

  1. 是SQL中的一个特殊角色,需要逃脱,因此查询需要两个。
  2. 输入来自也需要逃脱的字符串。仅拥有"\"会给一个。要获得两个您需要"\\"

相关内容

  • 没有找到相关文章

最新更新