提问者:小点点

为什么分区的镶木地板文件会占用更大的磁盘空间?


我正在学习使用python和pyarrow的拼花文件。Parquet在压缩和最小化磁盘空间方面非常出色。我的数据集是190MB的csv文件,当保存为snappy压缩拼花文件时,它最终成为单个3MB文件。

但是,当我将数据集保存为分区文件时,它们会导致组合的大小更大(61MB)。

这是我试图保存的示例数据集:

listing_id |     date     | gender | price
-------------------------------------------
     a     |  2019-01-01  |   M    |   100
     b     |  2019-01-02  |   M    |   100
     c     |  2019-01-03  |   F    |   200
     d     |  2019-01-04  |   F    |   200

当我按日期(300个唯一值)分区时,分区文件的总和为61MB。每个文件的大小为168.2kB。当我按性别分区(2个唯一值)时,分区文件的总和仅为3MB。

我想知道是否有任何最小文件大小,使得许多小文件组合起来会消耗更大的磁盘空间?

我的环境:

- OS: Ubuntu 18.04
- Language: Python
- Library: pyarrow, pandas

我的数据集来源:

https://www.kaggle.com/brittabettendorf/berlin-airbnb-data

# I am using calendar_summary.csv as my data from a group of datasets in that link above

我要保存为拼花文件的代码:

# write to dataset using parquet
df = pd.read_csv('./calendar_summary.csv')
table = pyarrow.Table.from_pandas(df)
pyarrow.parquet.write_table(table=table, where='./calendar_summary_write_table.parquet')

# parquet filesize
parquet_method1_filesize = os.path.getsize('./calendar_summary_write_table.parquet') / 1000
print('parquet_method1_filesize: %i kB' % parquet_method1_filesize)

我要保存为分区拼花文件的代码:

# write to dataset using parquet (partitioned)
df = pd.read_csv('./calendar_summary.csv')
table = pyarrow.Table.from_pandas(df)
pyarrow.parquet.write_to_dataset(
    table=table, 
    root_path='./calendar_summary/', 
    partition_cols=['date'])

# parquet filesize
import os
print(os.popen('du -sh ./calendar_summary/').read())

共1个答案

匿名用户

没有最小文件大小,但是存储页脚有开销,并且通过编码和压缩浪费了优化的机会。各种编码和压缩建立在数据具有一定程度的自相似性的思想之上,可以通过引用早期的类似事件来利用这些自相似性。当您将数据拆分为多个文件时,每个文件都需要一个单独的“初始数据点”,连续的数据可以引用回来,因此磁盘使用率会上升。(请注意,这一措辞中存在巨大的过度简化,以避免必须专门通过各种技术来节省空间,但请参阅以下答案中的几个例子。)

对Parquet文件大小有巨大影响的另一件事是数据插入的顺序。排序列的存储效率比随机排序列高得多。通过对数据进行分区,您可能会无意中改变其排序顺序。另一种可能性是,您根据排序数据的属性对数据进行分区,这在存储在单个文件中时节省了大量空间,而将数据拆分为多个文件会失去这个机会。最后,您必须记住,Parquet不是为存储几千字节的数据而优化的,而是为数兆字节或千兆字节(在单个文件中)或数PB(在多个文件中)而优化的。

如果您想检查数据在Parquet文件中的存储方式,Parquet的Java实现包括parquet-tools实用程序,提供了几个命令。有关构建和入门,请参阅其留档页面。单个命令的更详细描述由parquet-tools本身打印。您最感兴趣的命令可能是metadump