Опция-1:
Вы можете сделать .coalesce(n)
(случайное перемешивание не произойдет) на вашем фрейме данных и затем использовать .option("maxRecordsPerFile",n)
для контроля количества записей, записанных в каждом файле.
Опция-2:
Использование spark.sql.shuffle.partitions=n
эта опция используется для контроля количества случайных перемещений.
Затем использование df.sort("<col_name>").write.etc
создаст именно то количество файлов, которое мы упомянули для shuffle.partitions
.
Опция-3:
Hive:
Как только задание зажигания выполнено, trigger hive job
вставьте перезапись, выбрав ту же таблицу ииспользуйте sortby, распределенный, кластеризованный и задайте все конфигурации улья, которые вы упомянули в вопросе.
Insert overwrite table select * from table sort by <col1> distributed by <col2>
Option-4:
Hive:
Если у вас есть таблица ORC, то запланируйте сцепление задания для периодического запуска
alter table <table_name> concatenate;
Если ни один из методов не представляется возможным решением, тогда .repartition(n)
Это будет путь, так как это потребует дополнительных затрат, но мы собираемся получить файлы ~ одинакового размера в HDFS и повысить производительность при чтении этих файлов из hive / spark .