在 Spark SQL regexp_replace 中使用 \PC [重复]

Posted

技术标签:

【中文标题】在 Spark SQL regexp_replace 中使用 \\PC [重复]【英文标题】:Using \PC in Spark SQL regexp_replace [duplicate]在 Spark SQL regexp_replace 中使用 \PC [重复] 【发布时间】:2020-09-27 00:19:54 【问题描述】:

我理解 \PC 代表“不可见的控制字符和未使用的代码点” https://www.regular-expressions.info/unicode.html

当我这样做时,(在 databricks 笔记本中)它工作正常:

%sql
SELECT regexp_replace('abcd', '\\PC', 'x')

但以下失败(%python 和 %scala):

%python 
s = "SELECT regexp_replace('abcd', '\\PC', 'x')"
display(spark.sql(s))

java.util.regex.PatternSyntaxException: Illegal repetition near index 0
PC
^

SQL 命令在 HIVE 中也可以正常工作。 我还尝试按照here 的建议转义大括号,但没有用。

我还有什么遗漏的吗?谢谢。

【问题讨论】:

【参考方案1】:

Spark-Sql Api: 尝试添加 4 反斜杠 转义 1 \

spark.sql("SELECT regexp_replace('abcd', '\\\\PC', 'x')").show()
//+------------------------------+
//|regexp_replace(abcd, \PC, 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', '\\PC', 'x')").show()
//+------------------------------+
//|regexp_replace(abcd, \PC, x)|
//+------------------------------+
//|                          xxxx|
//+------------------------------+

DataFrame-Api: 中添加 2 反斜杠 \\ 转义 1 \

df.withColumn("dd",regexp_replace(lit("abcd"), "\\PC", "x")).show()
//+-----+----+
//|value|  dd|
//+-----+----+
//|    1|xxxx|
//+-----+----+

df.withColumn("dd",lit("\\")).show()
//+-----+---+
//|value| dd|
//+-----+---+
//|    1|  \|
//+-----+---+

【讨论】:

谢谢。了解为什么这两个 api 之间存在差异? @Gadam,从 Spark-2.0 开始,字符串文字发生了一些变化。更多信息在这里找到:github.com/apache/spark/pull/25001/files/…

以上是关于在 Spark SQL regexp_replace 中使用 \PC [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在火花中使用 Regexp_replace

PySpark 的 Regexp_replace 解释

SQL:Regexp_replace 但仅在值第一次出现在记录中时

如何在 edb 中使用相同的 REGEXP_REPLACE(Oracle sql)

Redshift SQL REGEXP_REPLACE 函数

在 oracle sql 中使用 regexp_replace 标准化地址