2016-06-16 5 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

正規表現の区切り文字削除します: ' ""'ヴァルREG = "" "\ sの{2、}" '、あなたが使用することはできません、RDDの内容を変更するだけで.mapを使用するには

。完全な文字列の一致が必要なので、matches()を使用します。 'find()'を使ってください。 –

+1

おそらく、あなたが望むのは、https://ideone.com/T8OSICのような、もっと簡単です。 –

+0

ありがとうウィクショーそれが助けになった! – user1384205

答えて

1

文字列データ内の非垂直の空白をすべて置き換えたいと思うようです。 replaceAll(パターンに一致するテキストのすべての出現箇所を置き換える)を[\t\p{Zs}]+ regexとすることをお勧めします。ここで

はちょうど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}]+は、タブ(\t)またはSpace Separator categoryの任意のUnicode空白の1つ以上の出現と一致します。

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

私が使用した正規表現の詳細をもう少し追加しました。 –

+0

あなたのコードはRDDを使用しません(RDD全体で 'replaceAll'を使うことはできません)。各行の 'replaceAll'を使った' map'は動作しますが、 –

+0

@TheArchetypalPaul:はい、私はちょうど正しいマッピングでそれを行う正規表現を投稿しました。あなたが望むなら、ソリューション全体を投稿するかもしれません。 –

関連する問題