Как контролировать размер файлов Parquet в Glue? - PullRequest
0 голосов
/ 05 октября 2019

Я загружаю набор данных в DynamicFrame, выполняю преобразование и затем записываю его обратно в S3:

datasink = glueContext.write_dynamic_frame.from_options(
    frame = someDateFrame, 
    connection_type = "s3", 
    connection_options = {
        "path": "s3://the-bucket/some-data-set"
    }, 
    format = "parquet"
)

В результате получается 12 файлов Parquet со средним размером около 3 МБ.

Прежде всего, я не понимаю, почему Glue / Spark по умолчанию не создает вместо этого один файл размером около 36 МБ, учитывая, что почти все программы-потребители (Presto / Athena, Spark) предпочитают размер файла около 100 МБа не куча маленьких файлов. Если у кого-то есть понимание, я был бы рад услышать об этом.

Но, практически говоря, мне интересно, возможно ли заставить Glue / Spark создавать большие файлы или, по крайней мере, большие файлы. Это возможно?

1 Ответ

1 голос
/ 07 октября 2019

Я еще не пробовал. Но вы можете установить accumulator_size в write_from_options.

Проверьте https://github.com/awslabs/aws-glue-libs/blob/master/awsglue/context.py, как передать значение.

В качестве альтернативы, вы можете использовать pyspark DF с 1 разделом перед записью вчтобы убедиться, что запись выполняется только в один файл.

df.coalesce(1).write.format('parquet').save('s3://the-bucket/some-data-set')

Обратите внимание, что запись в 1 файл не использует преимущества параллельной записи и, следовательно, увеличивает время записи.

...