ApacheSparkSQL—在向配置单元表插入数据时,每个分区一个文件(每个分区合并一个文件)

wqlqzqxt  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(514)

我在存储在s3位置的hive中创建了一个表。它大约有10列,分为3列:月、年和市,顺序相同。
我正在运行一个spark作业,它创建一个Dataframe(20亿行)并写入这个表。

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(\u1.name):\u2*)对数据框中的列重新排序,以与表中的顺序对齐。
当我运行上面的命令插入到表中时,我看到在每个城市下创建了这么多临时文件和多个小文件。

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

我希望得到一个单一的文件下,每个城市每年每月。按分区合并。
预期:

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

感谢您的帮助。

icomxhvb

icomxhvb1#

要按分区实现一个文件,应该使用

.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")

我认为您可以避免以前进行重新分区,如果您只执行分区方式,文件将按每个分区一个分区。

相关问题