apache-spark - 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() 或以其他方式执行此操作?
谢谢 !
解决方案
推荐阅读
- c++ - 枚举类的 C 样式转换为底层类型 char 的引用
- javascript - 将待办事项发布到我的数据库 - 它适用于 Postman
- javascript - 如何在php中嵌套双引号
- c# - VS2019 试图加载一个不再存在的 dll
- c# - 有没有办法在迭代期间编辑字典的值?
- python - 将 for 循环过滤器的结果保存到新的 csv
- ios - SwiftUI 使用导航链接从模态表转换到常规视图
- regex - 正则表达式在打开引号后匹配空格
- flutter - 调用私有构造函数 - 构造函数不存在
- python - python IndexError:列表索引超出范围,矩阵计算