У меня есть 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)
Любой намек о том, что здесь не так?
причину этой фильтрации не работает искра в лени: 'sc.textFile (р)' ленив - он возвращает RDD без фактического чтения файл (пока), поэтому 'Try (sc.textFile (p))' возвращает объект 'Success' независимо от существования файла, и ничто не отфильтровывается. Затем, когда вы вызываете 'collect' - это то, когда чтение действительно происходит, и слишком поздно, чтобы фильтр поймал сбои. Ваш ответ действительно правильный путь. –
Отличное объяснение @TzachZohar, спасибо! – Rami