hive/spark写入保存出现小文件过多的解决

文章介绍了在Pyspark中处理数据倾斜和小文件问题的两种方法。通过使用distributeby来控制分区,确保相同分区键的数据被分到同一Reduce,从而减少文件数量。另外,利用repartition或coalesce可以调整分区,优化文件分布,避免小文件过多。coalesce减少分区时要注意内存管理,而repartition则涉及全量数据shuffle。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据倾斜与小文件问题。在pyspark 中直接以 spark.sql(insert into tableNew ..partition(...).select ...from tableOld)的方式写入数据时,默认未开启动态分区会报错。开启动态分区后容易造成小文件过多从而磁盘报警。

目录

如何解决小文件问题

1、distribute by

2、repartition/coalesce


如何解决小文件问题

1、distribute by

少用动态分区,如果场景下必须使用时,那么记得在SQL语句最后添加上distribute by

假设现在有3个分区,我们可以将dt(分区键)相同的数据放到同一个Reduce处理,这样最多也就产生3个文件,dt相同的数据放到同一个Reduce可以使用DISTRIBUTE BY dt实现,所以修改之后的SQL如下:

spark.sql(""""
    insert into tableNew ..partition(...).
    select ...from tableOld 
    distribute by columnName如dt  cast(rand() * 3 as int)
""")

使用 distribute by cast( rand * N as int) 这里的N是指具体最后落地生成多少个文件数,那么最终就是每个分区目录下生成20个 文件大小基本一致的文件。

2、repartition/coalesce

对于已有的可以使用动态分区重刷数据,或者使用Spark程序重新读取小文件的table得到DataFrame,然后再重新写入,如果Spark的版本>=2.4那么推荐使用 repartition或者coalesce 如: 

df_data_out.coalesce(3).write.orc(path = file_path, mode = 'overwrite')
或者
df_data_out.repartition(3).write.orc(path = file_path, mode = 'overwrite')

coalesce 减少了分区数,它仅合并分区 ,因此最大程度地减少了数据移动,但须注意内存不足容易OOM。

repartition 可以增加或减少分区数量,它执行数据的完全shuffle,并确保数据平均分配。

参考: 

Hive/Spark小文件解决方案(企业级实战) - 腾讯云开发者社区-腾讯云

Spark | SparkSql Insert Overwrite 小文件过多_点滴笔记的博客

如何避免Spark SQL做数据导入时产生大量小文件_过往记忆的博客-优快云博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值