Spark DataFrame `regexp_replace` 中的反向引用

Wil*_*ton 3 regex backreference scala apache-spark spark-dataframe

我最近试图回答一个问题,当我意识到我不知道如何在 Spark DataFrames 的正则表达式中使用反向引用。

例如,使用 sed,我可以做到

> echo 'a1
b22
333' | sed "s/\([0-9][0-9]*\)/;\1/"                                                                                                   

a;1
b;22
;333
Run Code Online (Sandbox Code Playgroud)

但是使用 Spark DataFrames 我不能:

val df = List("a1","b22","333").toDF("str")
df.show

+---+
|str|
+---+
| a1|
|b22|
|333|
+---+

val res = df  .withColumn("repBackRef",regexp_replace('str,"(\\d+)$",";\\1"))
res.show

+---+-----------+
|str|repBackRef|
+---+----------+
| a1|       a;1|
|b22|       b;1|
|333|        ;1|
+---+----------+
Run Code Online (Sandbox Code Playgroud)

澄清一下:我不想要这种特殊情况下的结果,我想要一个与反向引用一样通用的解决方案,例如,sed.

还要注意 usingregexp_extract是缺乏的,因为它在没有匹配时表现不佳:

val res2 = df
  .withColumn("repExtract",regexp_extract('str,"^([A-z])+?(\\d+)$",2))
res2.show
Run Code Online (Sandbox Code Playgroud)

这样您就被迫像我在上述答案中所做的那样,对每个模式使用一列进行提取。

谢谢!

Wik*_*żew 6

您需要使用$+numeric_ID反向引用语法:

.withColumn("repBackRef",regexp_replace('str,"(\\d+)$",";$1"))
                                                         ^^
Run Code Online (Sandbox Code Playgroud)