Pyspark: как проверить, существует ли файл в hdfs

Я хочу проверить, существует ли в hdfs несколько файлов, прежде чем загружать их SparkContext. Я использую pyspark. Я пытался os.system("hadoop fs -test -e %s" %path) но поскольку у меня есть много путей для проверки, работа разбилась. Я попробовал также sc.wholeTextFiles(parent_path), а затем отфильтровать по клавишам. но он разбился и потому, что parent_path содержит много подпутей и файлов. Не могли бы вы помочь мне?

3 ответа

Расскажите, как он говорит Тристан Рид:

... (Spark) Он может читать многие форматы и поддерживает выражения Hadoop glob, которые чрезвычайно полезны для чтения из нескольких путей в HDFS, но у него нет встроенного средства, о котором я знаю перемещение каталогов или файлов, а также не имеет утилит, специфичных для взаимодействия с Hadoop или HDFS.

В любом случае, это его ответ на связанный с этим вопрос: Pyspark: получить список файлов/каталогов на пути HDFS

Как только у вас есть список файлов в каталоге, легко проверить, существует ли какой-либо конкретный файл.

Я надеюсь, что это может помочь как-то.


Одна из возможностей заключается в том, что вы можете использовать hadoop fs -lsr your_path для получения всех путей, а затем проверить, находятся ли интересующие вас пути в этом наборе.

Что касается вашего сбоя, возможно, это было результатом всех вызовов os.system, а не специфических для команды hadoop. Иногда вызов внешнего процесса может привести к проблемам, связанным с буферами, которые никогда не освобождаются, в частности буферы ввода-вывода (stdin/stdout).

Одним из решений было бы сделать один вызов bash script, который будет проходить по всем путям. Вы можете создать script с помощью строкового шаблона в вашем коде, заполнить массив путей в script, записать его, а затем выполнить.

Также может быть хорошей идеей переключиться на модуль subprocess python, который дает вам более подробный контроль над обработкой подпроцессов. Здесь эквивалент os.system:

process = subprocess.check_output(
 args=your_script,
 stdout=PIPE,
 shell=True
 )

Обратите внимание, что вы можете переключить stdout на нечто вроде дескриптора файла, если это поможет вам отлаживать или сделать процесс более надежным. Также вы можете переключить этот аргумент shell=True на False, если только вы не назовете фактический script или не используете такие вещи, как трубы или перенаправление.


Вы пытались использовать pydoop? Функция exists должна работать

licensed under cc by-sa 3.0 with attribution.