2017-11-09 15 views
0

に特定の文字で始まる行、私はこのようになりますテキストファイルを持っているを取得します。これは私が試したことです:スパーク

val lines = sc.textFile("textfile.txt") 
val reg = "^ABC".r 
val abc_lines = lines.filter(x => reg.pattern.matcher(x).matches) 
abc_lines.count() 

0が返されるので、何が問題になるのですか?

答えて

3

正規表現は必要ありません。これはstartsWithメソッドだけです。

val abc_lines = lines.filter(x => x.startsWith("ABC")) 
+0

[OK]を感謝としてやって!しかし、私のコードについて何が間違っているか教えていただけますか? – Stanko

1

メソッドマッチングは期待したとおりではありません(ドキュメントを参照してください)。あなたがfindFirstInメソッドを使用することができますMatching against a regular expression in Scala

+1

しかし、はい、この単純なケースでは正規表現は必要ありません。 –

+0

ありがとう、これも私に役立ちます。 – Stanko

0

- あなたがここでより多くの情報を見つけることができます

val list2 = List("ABC", "DEF gibberish", "ABC text", "DEF random") 
val lines2: Seq[String] = list.filter(reg.findFirstIn(_).isDefined) 
println(lines2.size) 

あなたはこのコードを使用することができ、その代わり

val list = List("ABC", "DEF gibberish", "ABC text", "DEF random") 
val reg = "^ABC".r 
val lines: Seq[String] = list.filter(x => reg.pattern.matcher(x).matches) 
println(lines.size) 

を理解するために、このスニペットを試すことができます正規表現次のように

val abc_lines = lines.filter(x => "^ABC".r.findFirstIn(x) == Some("ABC")) 

正しい結果が得られるはずです。

はスパークであなたTask not serializableエラーメッセージを与えるだろう、次の

val reg = "^ABC".r 
val abc_lines = lines.filter(x => reg.findFirstIn(x) == Some("ABC"))