在 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
SQL:Regexp_replace 但仅在值第一次出现在记录中时
如何在 edb 中使用相同的 REGEXP_REPLACE(Oracle sql)