gpt4 book ai didi

apache-spark - 重新分区以避免大量小文件

转载 作者:可可西里 更新时间:2023-11-01 15:49:03 25 4
gpt4 key购买 nike

目前我有一个 ETL 作业,它读取几个表,执行某些转换并将它们写回每日表。

我在 spark sql 中使用以下查询 “插入 dbname.tablename PARTITION(year_month) 从 Spark_temp_table 中选择 *插入所有这些记录的目标表按年 X 月级别分区。每天生成的记录并不多,因此我按年 X 月级别进行分区。

但是,当我检查分区时,我的代码每天运行时它都有约 50MB 的小文件(代码必须每天运行),最终我的分区中将有大约 30 个文件,总计约 1500MB

我想知道是否有办法在我每天追加记录的同时在一个分区中创建一个(或者根据 block 大小限制可能创建 2-3 个文件)

我认为我能做到的方法是从我的 spark 数据帧中的相关分区读取所有内容,将其附加到最新记录并在写回之前重新分区。如何确保我只从相关分区读取数据,并且只有该分区被较少数量的文件覆盖?

最佳答案

您可以使用 DISTRIBUTE BY 子句来控制记录在每个分区内的文件中的分布方式。

要每个分区有一个文件,您可以使用DISTRIBUTE BY year, month

并且每个分区有 3 个文件,您可以使用 DISTRIBUTE BY year, month, day % 3

完整查询:

INSERT INTO dbname.tablename 
PARTITION(year_month)
SELECT * from Spark_temp_table
DISTRIBUTE BY year, month, day % 3

关于apache-spark - 重新分区以避免大量小文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52905267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com