2016-03-09 2 views
1

У меня есть Array[String], который содержит пути к некоторым файлам. Массив автоматически генерируется, поэтому нет гарантии, что файлы существуют.Искра: прочитайте несколько файлов и проигнорируйте недостающие

Я хотел бы прочитать все эти пути, загрузить существующие в RDD и игнорировать несуществующие.

Я попытался сделать следующее:

import scala.util.Try 

val arrayOfFilePaths: Array[String] = ["path1", "path2", "path3", "path4"] 
val allRecords = sc.union(arrayOfFilePaths.map(p => Try(sc.textFile(p))).filter(_.isSuccess).map(_.get)) 

Но, похоже, это не удалось избежать несуществующие файлы, я получаю следующее сообщение об ошибке при попытке allRecords.collect():

Input path does not exist: file:/path/to/unexistingFile 
    at org.apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:285) 

Любой намек о том, что здесь не так?

+1

причину этой фильтрации не работает искра в лени: 'sc.textFile (р)' ленив - он возвращает RDD без фактического чтения файл (пока), поэтому 'Try (sc.textFile (p))' возвращает объект 'Success' независимо от существования файла, и ничто не отфильтровывается. Затем, когда вы вызываете 'collect' - это то, когда чтение действительно происходит, и слишком поздно, чтобы фильтр поймал сбои. Ваш ответ действительно правильный путь. –

+0

Отличное объяснение @TzachZohar, спасибо! – Rami

ответ

3

ОК, я выяснил решение.

Я отфильтровал массив перед загрузкой файлов.

import java.nio.file.{Paths, Files} 

val filteredPaths = arrayOfFilePaths.filter(p => Files.exists(Paths.get(p))).mkString(",") 

Тогда я могу загрузить эти файлы

val allRecords = sc.textFile(filteredPaths) 
Смежные вопросы