Spark DataFrame 中的反向引用`regexp_replace`
Back-reference in Spark DataFrame `regexp_replace`
我最近试图回答 ,当我意识到我不知道如何在 Spark DataFrames 的正则表达式中使用反向引用时。
例如,使用 sed,我可以做到
> echo 'a1
b22
333' | sed "s/\([0-9][0-9]*\)/;/"
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+)$",";"))
^^
我最近试图回答
例如,使用 sed,我可以做到
> echo 'a1
b22
333' | sed "s/\([0-9][0-9]*\)/;/"
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+)$",";"))
^^