Когда PySpark записывает фрейм данных в json, я получаю пустой каталог, почему? - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь записать содержимое кадра данных на диск таким образом, чтобы каждая строка представляла собой отдельный файл в некоторой папке.Я использую следующий код:

df.write.save(
    "data/questions/", 
    format="json", 
    mode="overwrite"
)

Это создает папку вопросов и завершается без ошибок.Однако папка пуста, за исключением файла «SUCCESS» с нулевым байтом.Фрейм данных определенно содержит данные, подтвержденные методом show.Я также могу успешно записать фрейм данных в один файл json со следующим кодом:

with open('data/questions/foo.json', 'w') as f:
    f.write(json.dumps(df.toJSON().collect()))

Это успешно записывает фрейм данных в один файл.Однако мне нужно записать каждую строку в свой собственный файл.Я также не уверен, насколько масштабируем метод toJSON, так как я предполагаю, что он сначала преобразует весь фрейм данных.Мой фрейм данных может оказаться очень большим, поэтому в идеале я не хочу сначала конвертировать все в памяти.Позже я также предоставлю путь S3.

Так как мне заставить работать файл для каждой версии строки?Любая дополнительная информация о памяти касается одного подхода по сравнению с другим также будет оценена.

1 Ответ

0 голосов
/ 11 июля 2019

Комментарий user10938362 содержит ссылку на объяснение того, как вы не можете таким образом записывать содержимое из блока данных в нераспределенное хранилище данных.Вместо того, чтобы закрыть это как дубликат, я отвечу на суть моего вопроса, который состоял в том, как я могу записать содержимое большого фрейма данных в хранилище.

Моя первая попытка была записать результат непосредственно вS3.Я обнаружил, что при работе с существенными фреймами данных, т. Е. ~ 50 ГБ, операция записи не удалась, потому что S3 постоянно переименовывает файлы посредством такой операции, и это нарушает Spark.Правильный способ решения проблемы - сначала записать фрейм данных в HDFS, а затем скопировать его оттуда в S3 или в любое другое облачное хранилище, которое вы могли бы использовать.Команда для записи в HDFS в python:

some_df.write.mode("overwrite").save(
    "hdfs:///some_file_name",
    format="json")

Как только данные были записаны в HDFS, я выполняю следующую команду из терминала, чтобы скопировать их в S3:

s3-dist-cp --src hdfs:///some_file_name --dest s3a://some_bucket/some_path 

Вы также можете запустить эту команду копирования из python:

import os

os.system("/usr/bin/s3-dist-cp --src hdfs:///some_file_name --dest s3a://some_bucket/some_path")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...