Pyspark записать несколько выходов по ключу без раздела - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть фрейм данных PySpark, который содержит записи для 6 миллионов человек, каждый с отдельным userid. Каждый userid имеет 2000 записей. Я хочу сохранить данные каждого userid в отдельный CSV-файл с именем userid.

У меня есть код, который делает это, взят из решения этого вопроса . Однако, насколько я понимаю, код будет пытаться разделить каждый из 6 миллионов идентификаторов. На самом деле меня это не волнует, так как я собираюсь записать каждый из этих файлов на другой не-HDFS сервер.

Следует отметить, что код работает для небольшого числа userids (до 3000), но не работает на полных 6 млн.

Код

output_file = '/path/to/some/hdfs/location'
myDF.write.partitionBy('userid').mode('overwrite').format("csv").save(output_file)

Когда я запускаю вышеупомянутое, требуются НЕДЕЛИ, чтобы выполнить с большей частью того времени, потраченного на шаг письма Я предполагаю, что это из-за количества разделов. Даже если я вручную укажу количество разделов на что-то маленькое, выполнение все равно займет много времени.

Вопрос : Есть ли способ сохранить все данные userids в один файл с хорошо названным именем (имя файла = userid) без разбиения?

1 Ответ

0 голосов
/ 05 декабря 2018

Учитывая требования, мы действительно надеемся на улучшение. HDFS не предназначена для обработки очень маленьких файлов, и практически любая файловая система будет испытывать трудности, если вы попытаетесь открыть 6 миллионов файловых дескрипторов одновременно.

Вы можете немного улучшить это, если вы этого еще не сделали, вызвав передел перед тем, как написать:

(myDF
    .repartition('userid')
    .write.partitionBy('userid').mode('overwrite').format("csv").save(output_file))

Если вы можете принять несколько идентификаторов на файл, вы можете использовать постоянные таблицы и сегменты

myDFA
  .write
  .bucketBy(1024, 'userid')  # Adjust numBuckets if needed
  .sortBy('userid')
  .mode('overwrite').format("csv")
  .saveAsTable(output_table))

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

Наконец, если вывод простого текста не является жестким требованием, вы можете использовать любую защищенную базу данных и данные разделов по userid.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...