将数据插入到蜂巢外部表中创建非常小的零件文件



除了retartition(放慢处理缓慢(以将所有1MB文件组合到多个大文件中,还有其他方法吗?

在500GB的数据上运行Spark Code,每个执行者24个内核,但将它们保存到具有128MB的大文件中。现在它将每个文件保存1 MB。

spark.sql("set pyspark.hadoop.hive.exec.dynamic.partition=true")
spark.sql("set pyspark.hadoop.hive.exec.dynamic.partition.mode=nonstrict")
spark.sql("set hive.exec.dynamic.partition=true")
spark.sql("set hive.exec.dynamic.partition.mode=nonstrict")
spark.sql("set hive.merge.tezfiles=true")
spark.sql("SET hive.merge.sparkfiles = true")
spark.sql("set hive.merge.smallfiles.avgsize=128000000")
spark.sql("set hive.merge.size.per.task=128000000")

option-1:

您可以在数据框架上进行.coalesce(n)(不会发生混乱(,然后使用 .option("maxRecordsPerFile",n) 控制每个文件中写的记录的数量。

option-2:

使用 spark.sql.shuffle.partitions=n 此选项用于控制发生的散装次数。

然后使用 df.sort("<col_name>").write.etc 将精确创建我们提到的shuffle.partitions的文件数。

option-3:

Hive:

一旦完成火花作业, trigger hive job 通过选择同一表并使用排序,分发,群集并设置您提到的所有蜂巢配置。

>
Insert overwrite table select * from table sort by <col1> distributed by <col2>

option-4:

Hive:

如果您有ORC表,请安排连接工作以定期运行

alter table <table_name> concatenate;

如果这些方法似乎都不是可行的解决方案,那么 .repartition(n) 将是要走的方法,因为这将带来额外的开销,但我们最终会〜均匀尺寸的文件在HDF中,并在从 hive/spark 的读取这些文件时提高性能。

最新更新