2016-10-20 54 views
1

我最近試圖回答question,當時我意識到我不知道如何在Spark DataFrames的正則表達式中使用反向引用。Spark DataFrame中的反向引用`regexp_replace`

例如,對於SED,我可以做

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

a;1 
b;22 
;333 

但隨着星火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

嘗試使用'$ 1',而不是'\\ 1'。 –

+0

是的!謝謝!我尋找這樣一個這樣簡單的語法這樣的事情,但我沒有找到它。如果你把它放在答案中,我會接受。 – Wilmerton

回答

2

您需要使用$ + numeric_ID逆向引用的語法:

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