【问题标题】:One file per partition (Coalesce per pertition) while inserting data into hive table将数据插入配置单元表时,每个分区一个文件(每个分区合并)
【发布时间】:2018-02-16 15:27:48
【问题描述】:

我在存储在 s3 位置的配置单元中创建了一个表。 它有大约 10 列,按相同的顺序划分为 3 列月、年和城市。

我正在运行一个创建数据帧(20 亿行)并写入此表的 spark 作业。

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

感谢任何帮助。

【问题讨论】:

    标签: hive apache-spark-sql spark-dataframe hadoop-partitioning partition-by


    【解决方案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,文件将被每个分区一个分区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多