首页 > 解决方案 > PYSPARK - 在 partitionby() 之前使用 repartition() 将数据帧写入镶木地板文件时性能下降的解决方案?

问题描述

我想将我的数据(包含在数据框中)写入镶木地板文件。我需要按两个变量对数据进行分区:“月”和“级别”。(数据总是在这两个变量上过滤)

如果我执行以下操作, data.write.format("parquet").partitionBy("month", "level").save("...")我最终会得到预期的分区,但是每个分区有很多文件。其中一些文件非常小,这会损害对数据运行的查询的性能。

为了纠正这个问题,我尝试repartition在写入数据之前申请: data.repartition("month", "level").write.format("parquet").partitionBy("month", "level").save("...")这正是我想要的(每个分区 1 个文件,每个文件都有一个合适的大小)。

===>这里的问题是重新分区会导致数据完全洗牌,这意味着对于400Gb的输入数据,我最终会得到几Tb的洗牌......

有什么方法可以在 partitionby() 之前优化 repartition() 或以其他方式执行此操作?

谢谢 !

标签: apache-sparkpysparkpartition

解决方案


推荐阅读