Один файл на раздел (Coalesce на pertition) при вставке данных в таблицу кустов

У меня есть таблица, созданная в улье, хранится в S3 месте. Он имеет около 10 столбцов и разделен на 3 столбца: месяц, год и город в том же порядке.

Я запускаю искровое задание, которое создает фрейм данных (2 миллиарда строк) и записывает в эту таблицу.

val partitions:Seq[Column] = Seq(col("month"),col("year"),col("city"))
df.repartition(partitions: _*).selectExpr(cs.map(_.name): _*).write.mode("overwrite").insertInto(s"$tableName")

selectExpr (cs.map (_. name): _ *) переупорядочивает столбцы в кадре данных в соответствии с порядком в таблице.

Когда я запускаю приведенную выше команду для вставки в таблицу, я вижу, что в каждом городе создано так много промежуточных файлов и несколько маленьких файлов.

s3://s3Root/tableName/month/year/city/file1.csv
                                      file2.csv
                                      ...
                                      file200.csv

Я надеюсь получить один файл под каждым городом в год в месяц.Объединить на раздел.

Ожидаемое:

s3://s3Root/tableName/month/year/city/file.csv

Любая помощь приветствуется.

1 ответ

Чтобы получить один файл по разделу, вы должны использовать

.partitionBy("")

val partitions:Seq[Column] = Seq(col("month"),col("year"),col("city"))

df.repartition(partitions: _*).selectExpr(cs.map(_.name): _*).write.partitionBy(partitions: _*).mode("overwrite").insertInto(s"$tableName")

Я думаю, что вы могли бы избежать перераспределения раньше, если вы делаете только partitionBy, файлы будут разделены по одному на раздел.

Другие вопросы по тегам