2016-06-16 106 views
3

經過大量程序化清理後,我的數據集看起來像這樣(顯示部分數據集在此處)。刪除Spark中RDD行中的連續空格

ABCD  A [email protected]        79 
BGDA  F [email protected]        89 

我想這轉換成以下進一​​步星火據幀操作

ABCD,A,[email protected],79 
BGDA,F,[email protected],89 


val reg = """/\s{2,}/""" 
val cleanedRDD2 = cleanedRDD1.filter(x=> !reg.pattern.matcher(x).matches()) 

但這沒有返回。我如何找到並用分隔符替換空字符串? 謝謝! rt

+0

拆下正則表達式的分隔符:'VAL REG = 「」 「\ s {2}」 「」'你不能用'。匹配()',因爲它需要完整的字符串匹配。使用'find()'。 –

+1

也許,你想要的更簡單,就像https://ideone.com/T8OSIC。 –

+0

謝謝Wiktor。這有幫助! – user1384205

回答

1

看來你只是想要替換字符串數據中的所有非垂直空格。我建議使用replaceAll(用於替換所有匹配該模式的文本)與[\t\p{Zs}]+正則表達式。

這裏只是一個sample code

val s = "ABCD  A [email protected]        79\nBGDA  F [email protected]        89" 
val reg = """[\t\p{Zs}]+""" 
val cleanedRDD2 = s.replaceAll(reg, ",") 
print(cleanedRDD2) 
// => ABCD,A,[email protected],79 
//  BGDA,F,[email protected],89 

這裏是regex demo[\t\p{Zs}]+匹配1個或多個出現的選項卡(\t)或來自Space Separator category的任何Unicode空白。

要修改RDD的內容,只需使用.map

newRDD = yourRDD.map(elt => elt.replaceAll("""[\t\p{Zs}]+""", ",")) 
+0

我添加了一些我使用的正則表達式的更多細節。 –

+0

您的代碼不使用RDD(並且不能在整個RDD上使用'replaceAll')。 'map'和'replaceAll'每行都可以工作 –

+0

@TheArchetypalPaul:是的,我知道,我剛剛發佈了正確的映射的正則表達式。如果你想要,你可以發佈整個解決方案。 –