Сначала мне нужно разделить «группу клиентов», но я также хочу убедиться, что у меня есть один CSV-файл на «customer_group». Это связано с тем, что для вывода необходимы данные временных рядов, и они не могут быть распределены по нескольким файлам.
я пробовал: datasink2 = spark_df1.write.format("csv").partitionBy('customer_group').option("compression","gzip").save(destination_path+'/traintestcsvzippartitionocalesce')
но он создает несколько файлов меньшего размера внутри пути customer_group/ с форматами csv.gz0000_part_00.gz , csv.gz0000_part_01.gz ....
я пытался использовать :datasink2 = spark_df1.write.format("csv").partitionBy('customer_group').coalesce(1).option("compression","gzip").save(destination_path+'/traintestcsvzippartitionocalesce')
но выдает следующую ошибку:
AttributeError: объект «DataFrameWriter» не имеет атрибута «объединить»
Есть ли решение?
Я не могу использовать переразметку (1) или объединение (1) напрямую без раздела, поскольку он создает только 1 файл, и только один рабочий узел работает одновременно (последовательно) и требует больших вычислительных ресурсов.






Функция передел также принимает в качестве аргументов имена столбцов, а не только количество разделов. Перераспределение по столбцу раздела записи заставит искру сохранить один файл в каждой папке.
Обратите внимание, что если один из ваших разделов искажен, а одна группа клиентов имеет большую часть данных, у вас могут возникнуть проблемы с производительностью.
spark_df1 \
.repartition("customer_group") \
.write \
.partitionBy("customer_group") \
...
Это работает отлично. также сократилось время бега с 20 минут до 3 минут. Как вы указали, мне пришлось равномерно сбалансировать нагрузку между узлами, чтобы получить наилучшие результаты.