В Apache Spark `bucketBy`, как вы генерируете 1 файл на корзину вместо 1 файла на корзину на раздел? - PullRequest
1 голос
/ 04 июля 2019

Я пытаюсь использовать функцию 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?Или есть лучший способ справиться с этой проблемой?На данный момент мне кажется, что мне приходится выбирать между снижением параллелизма моего кластера (уменьшением числа записывающих устройств) или уменьшением параллелизма моих файлов паркета (уменьшением количества сегментов).

Спасибо

...