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

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

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

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

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

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

  1. %python
  2. s = "SELECT regexp_replace('abcd', '\\P{C}', 'x')"
  3. display(spark.sql(s))
  4. java.util.regex.PatternSyntaxException: Illegal repetition near index 0
  5. P{C}
  6. ^

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)|
//+-----------------+
//| |
//+-----------------+

  1. (或)
  2. 启用 `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|
//+------------------------------+

  1. `DataFrame-Api:` 添加2反斜杠 `\\` 逃逸1 `\` ```
  2. df.withColumn("dd",regexp_replace(lit("abcd"), "\\P{C}", "x")).show()
  3. //+-----+----+
  4. //|value| dd|
  5. //+-----+----+
  6. //| 1|xxxx|
  7. //+-----+----+
  1. df.withColumn("dd",lit("\\")).show()
  2. //+-----+---+
  3. //|value| dd|
  4. //+-----+---+
  5. //| 1| \|
  6. //+-----+---+
展开查看全部

相关问题