2016-07-18 2 views
2

私はテキストファイルを読み込み、単語数の例を実装しています。問題は空のキーでRDDを取得していることです。私は空を取得していますなぜ、私はそれを削除するにはどのように確認していないRDDから空のキーを削除する

val tokens = sc.textFile("test.txt").flatMap(line => line.split(",")).map(_.trim) 

val tableForFrequency = tokens.map(word => (word, 1)) 
    .reduceByKey((a, b) => a + b) 

tableForFrequency.saveAsTextFile("file.txt") 

:ここ

はコードです。

ご注意:私はScala/Sparkの初心者です。この質問を投稿する前に、すでに関連する質問を探しています。

+1

なぜあなたではないでしょうか?空の文字列はまだ文字列として残っています.... – zero323

+1

どのコースでこれを課題として設定していますか?ここ数日、いくつかの "Spark/Scalaの初心者が単語数を実装する"という質問がありました。 –

答えて

3

のは、次の例を考えてみましょう:

val data = Seq(" ","w","w2","") 
// data: Seq[String] = List(" ", w, w2, "") 

val tokens = sc.parallelize(data).flatMap(line => line.split(",")).map(_.trim) 
// tokens: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[9] at map at <console>:29 

あなたはtriming後に長さ= 0の文字列をフィルタリングするだけ必要があります:

val tableForFrequency = tokens.filter(_.length > 0).map(word => (word, 1)).reduceByKey(_ + _) 
// tableForFrequency: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[13] at reduceByKey at <console>:31 

tableForFrequency.collect 
// res4: Array[(String, Int)] = Array((w2,1), (w,1)) 
0

あなたfilter関数はのような複雑かのように単純なことができあなたがそれが必要なので。

フィルター機能では、空でない行にはTrue、文字列にはFalseを返します。です。そしてまた、文字列の観点から、emptylength == 0

擬似コードを別の言い方である:

.filter(string.length != 0) 
関連する問題