首页 > 解决方案 > 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 倍(行数相同)。那么以下所有步骤都会变得非常缓慢。任何建议如何解决这个问题或只是如何理解发生了什么?

我尝试了很多方法来找出问题所在:

更多细节:我正在处理大数据集,约 3.000.000.000 条记录,但列很小,主要是整数 + 时间戳。

如果有人知道解决方案,我会非常高兴。另外,如果您只是知道如何调试它并了解大小爆炸的原因会对我有所帮助。

标签: apache-sparkpysparkdatabricksparquetdelta-lake

解决方案


推荐阅读