反向引用Spark DataFrame ' regexp_replace '



我最近试图回答一个问题,当我意识到我不知道如何在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

这样你就被迫在每个模式中使用一列来提取,就像我在上面的答案中所做的那样。

谢谢!

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

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

相关内容

  • 没有找到相关文章

最新更新