Spark DataFrame中的反向引用`regexp_replace`

时间:2016-10-20 09:32:03

标签: regex scala apache-spark spark-dataframe backreference

我最近尝试回答question,当时我意识到我不知道如何在带有Spark DataFrames的regexp中使用反向引用。

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

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

a;1
b;22
;333

但是使用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|
+---+----------+

为了说清楚:我不希望在这种特殊情况下得到结果,我想要一个与后向引用一样通用的解决方案,例如sed

另请注意,缺少使用regexp_extract,因为在没有匹配时行为很差:

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

因此,您被迫使用每个模式一列来提取,就像我在answer中所做的那样。

谢谢!

1 个答案:

答案 0 :(得分:3)

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

.withColumn("repBackRef",regexp_replace('str,"(\\d+)$",";$1"))
                                                         ^^