spark sql合并小文件_Delta lake 的分区表中的小文件合并

Delta Lake 作为存储是非常好用的,之前公司是通过 spark的jdbc将数据以parquet的格式存储到hdfs上,然后分区、合并、删除等。

但是这个会有问题,例如 删除的时候如果有其他任务在读取删除的文件会导致任务的失败等。最主要的是 这些分区 合并、删除、插入 都是 用spark1.6写的,里面的逻辑不想赘述了。

如今在微信中不经意的看到了Delta Lake,果断被它的优点所吸引,有点像cassandra。删除文件加入了 墓碑机制,相当于打个标签,但是不会立刻执行删除。但是使用 spark.read.format("delta")去读取的时候又不会读取到已经被打上删除标签的文件,非常好。

不过,在使用过程中,针对需要合并的操作,是使用 merge操作实现的,merge中又会触发shuffle,而shuffle 的值一旦设置的大点,会导致输出到hdfs的结果文件会很多。这个就很烦了。

后来一直在找 怎么解决小文件的问题。

后来发现 Delta Lake 在写入的时候有replaceWhere 这个选项。

可以在 这里设置替换的分区,这样可以通过

13b7d18a041f9c31d58eb677e115ba6b.png

这样,使用 repartition 方法再重新写进去,就可以把 结果 合并了,不过在没有执行 vacuum 方法之前,文件还是不会删除的,但是执行 vacuum 后,可以看到,指定分区的文件个数已经变成了

numFiles的值了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值