我想将数据(包含在数据框中)写入镶木地板文件中。 我需要按两个变量对数据进行分区:“月”和“级别”。 (数据总是根据这两个变量进行过滤)
如果我执行以下操作
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()或以其他任何方式做到这一点?
谢谢!