【问题标题】:Why does a sorted parquet file have a larger size than a non-sorted one?为什么排序后的 parquet 文件比未排序的文件大?
【发布时间】:2021-09-30 22:42:10
【问题描述】:

我有一个如下创建的数据框:

expanded_1 = pd.DataFrame({"Point": [random.choice(points) for x in range(30000000)], 
                     "Price": [random.choice(prices) for x in range(30000000)]
                    })

我存储为 parquet 文件,磁盘上的大小为 90.2 MB。

在研究如何使用 parquet 进行压缩后,我按 Point 对值进行排序,以便可以将相似的数据保持在一起,同时理解这将使默认 parquet 压缩技术更有效。然而我看到的结果却完全相反。在运行以下:

expanded_1.sort_values(by=['Point']).to_parquet('/expanded_1_sorted.parquet')

生成的文件大小为 211 MB。

是什么导致尺寸增加?

【问题讨论】:

  • 打印两者的输出是什么?
  • 您能否分享一下pointsprices 是什么?您通常可以通过检查 pyarrow.parquet.read_metadata 的返回来找到有关如何对 parquet 文件进行编码的更多信息。如果您检查这两个文件的元数据,会发现什么有趣的东西吗?
  • @Pace 我得到了与points = prices = range(1000) 相似的结果。我认为这是乱码,reset_index(drop=True) 似乎可以修复它。 (但我真的不知道自己在做什么。)
  • @don'ttalkjustcode 乱码索引非常有意义。 Arrow 将检测一个简单的线性索引并将其存储为元数据而不是实际列。如果索引被打乱,它将被强制保存一个实际的列,它将使用 int64。请将其添加为答案。

标签: parquet pyarrow


【解决方案1】:

我认为这是乱序索引,reset_index(drop=True) 似乎可以修复它。当我使用points = prices = range(1000) 进行测试时,它并没有变得更大,而是变得更小(未分类原始的一半)。

或者正如@0x26res 指出的那样,.sort_values(by=['Point'], ignore_index=True) 更有效。无需修复您不会破坏的东西。结果是一样的。

【讨论】:

  • 调用.sort_values(by=['Point'], ignore_index=True)比以后调用reset_index(drop=True)效率更高
  • 证明了我之前所说的,我真的不知道自己在做什么:-)。谢谢,已添加。
猜你喜欢
  • 1970-01-01
  • 2017-03-11
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 2011-12-17
相关资源
最近更新 更多