Один файл на раздел (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, файлы будут разделены по одному на раздел.