在sparksql regexp\u replace中使用\p{c}

iezvtpos  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(1067)

这个问题在这里已经有了答案

为什么sparksql在sql查询中需要两个文本转义反斜杠(1个答案)
7个月前关门了。
我知道\p{c}表示“不可见的控制字符和未使用的代码点”https://www.regular-expressions.info/unicode.html
当我这样做时,(在databricks笔记本中),它工作得很好:

%sql
SELECT regexp_replace('abcd', '\\P{C}', 'x')

但以下操作失败(包括%python和%scala):

%python 
s = "SELECT regexp_replace('abcd', '\\P{C}', 'x')"
display(spark.sql(s))

java.util.regex.PatternSyntaxException: Illegal repetition near index 0
P{C}
^

sql命令在配置单元中也可以正常工作。我也试着摆脱这里建议的花括号,但没有用。
我还缺什么吗?谢谢。

8iwquhpp

8iwquhpp1#

Spark-Sql Api: 尝试添加4个反斜杠以转义1 \ ```
spark.sql("SELECT regexp_replace('abcd', '\\P{C}', 'x')").show()
//+------------------------------+
//|regexp_replace(abcd, \P{C}, x)|
//+------------------------------+
//| xxxx|
//+------------------------------+

spark.sql("SELECT string('\\')").show()
//+-----------------+
//|CAST(\ AS STRING)|
//+-----------------+
//| |
//+-----------------+

(或)
启用 `escapedStringLiterals` 属性返回spark-1.6字符串文字

spark.sql("set spark.sql.parser.escapedStringLiterals=true")
spark.sql("SELECT regexp_replace('abcd', '\P{C}', 'x')").show()
//+------------------------------+
//|regexp_replace(abcd, \P{C}, x)|
//+------------------------------+
//| xxxx|
//+------------------------------+

在 `DataFrame-Api:` 添加2反斜杠 `\\` 逃逸1 `\` ```
df.withColumn("dd",regexp_replace(lit("abcd"), "\\P{C}", "x")).show()
//+-----+----+
//|value|  dd|
//+-----+----+
//|    1|xxxx|
//+-----+----+
df.withColumn("dd",lit("\\")).show()
//+-----+---+
//|value| dd|
//+-----+---+
//|    1|  \|
//+-----+---+

相关问题