Я пытаюсь использовать функцию Spark bucketBy для довольно большого набора данных.
dataframe.write()
.format("parquet")
.bucketBy(500, bucketColumn1, bucketColumn2)
.mode(SaveMode.Overwrite)
.option("path", "s3://my-bucket")
.saveAsTable("my_table");
Проблема состоит в том, что в моем кластере Spark имеется около 500 разделов / задач / исполнителей (не уверентерминологии), поэтому я получаю файлы, которые выглядят следующим образом:
part-00001-{UUID}_00001.c000.snappy.parquet
part-00001-{UUID}_00002.c000.snappy.parquet
...
part-00001-{UUID}_00500.c000.snappy.parquet
part-00002-{UUID}_00001.c000.snappy.parquet
part-00002-{UUID}_00002.c000.snappy.parquet
...
part-00002-{UUID}_00500.c000.snappy.parquet
part-00500-{UUID}_00001.c000.snappy.parquet
part-00500-{UUID}_00002.c000.snappy.parquet
...
part-00500-{UUID}_00500.c000.snappy.parquet
Это 500x500 = 250000 паркетных файлов в пачках!FileOutputCommitter
требуется вечно, чтобы передать это в S3.
Есть ли способ генерировать один файл на группу , как в Hive?Или есть лучший способ справиться с этой проблемой?На данный момент мне кажется, что мне приходится выбирать между снижением параллелизма моего кластера (уменьшением числа записывающих устройств) или уменьшением параллелизма моих файлов паркета (уменьшением количества сегментов).
Спасибо