我正在使用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,}$'
如下所述,需要四个字符,因为
的原因有两个:
-
是SQL中的一个特殊角色,需要逃脱,因此查询需要两个。
- 输入来自
也需要逃脱的字符串。仅拥有
"\"
会给一个。要获得两个您需要
"\\"
。