apache-spark - Spark - Parquet 或 Delta - 文件大小爆炸
问题描述
我使用内连接将 2 个整数列替换为 1 个整数列。之后,当从 PySpark 编写 parquet/delta 时,我的 DataFrame 是原始大小的 20 倍。
我的初始 Spark DataFrame 有大约 15 列,其中 2 列是整数 ID 列(ID1 和 ID2),这意味着它们仅供参考。
现在我想将它们映射到单个 ID 列。为此,我创建了一个映射表:ID1 | ID2 | ID 然后我做一个内部连接,并删除 ID1 和 ID2。
这是此步骤的代码:
我通过这个表从 ID1 + ID2 => ID 创建一个映射:
my_index = df
.groupBy(['ID1','ID2'])
.count()
.withColumn("ID",F.row_number()
.over(Window.partitionBy().orderBy(F.col("count").desc())))
然后我使用内部连接将 ID1 + ID2 替换为 ID:
df_new = df
.join(my_index, ['ID1','ID2'], 'inner')
.drop('ID1','ID2')
在此之后: df_new 是 df 文件大小的 20 倍(行数相同)。那么以下所有步骤都会变得非常缓慢。任何建议如何解决这个问题或只是如何理解发生了什么?
我尝试了很多方法来找出问题所在:
- 我删除了一些列,仍然有这个因素 20 爆炸
- 我试过 Parquet,我试过 Delta... 没区别
- 我没有添加 ID 列,而是添加了一些随机整数,这样更好,大小仅增加了 +30%
- 我没有删除 ID1 和 ID2,因为它们可能有助于压缩文件大小,这没有帮助
- 在因子 20 爆炸之后,我再次删除了新的 ID 列,但 DataFrame 仍然是大约。相同的大小。
更多细节:我正在处理大数据集,约 3.000.000.000 条记录,但列很小,主要是整数 + 时间戳。
如果有人知道解决方案,我会非常高兴。另外,如果您只是知道如何调试它并了解大小爆炸的原因会对我有所帮助。
解决方案
推荐阅读
- node.js - 发布到 symfony 端点的 Node.js 表单数据为 NULL
- google-cloud-platform - 尽管检查了防火墙规则,但与谷歌云上的虚拟机实例的 HTTP 连接失败
- javascript - 为什么我在使用 Sequelize 填充字段时遇到错误?
- haskell - Haskell 中的“f (a -> b)”类型签名是什么意思?
- opencl - OpenCl:如何使用 INT4/8?
- ruby-on-rails - 如何使 sprockets(或 rack,或 nginx?)激励浏览器缓存字体并正确返回 304?
- docker - 如何从崩溃的 Docker Desktop 容器中获取日志
- node.js - 试图从 mongodb 数据库中检索特定数据,但在控制台中显示未定义
- c++ - 矩阵数据数组的Tensorflow tflite c ++ api推理
- python - 为什么我的函数不打印我的 dString 变量?