2016-07-18 1 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 

Вам просто понадобится, чтобы отфильтровать строки с длиной = 0 после Triming:

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 для строк, которые являются пустыми. А также, с точки зрения строк, empty это еще один способ сказать length == 0

псевдо-код:

.filter(string.length != 0) 
Смежные вопросы