Я изучаю паркетный файл, используя python и pyarrow. Паркет отлично сжимает и минимизирует дисковое пространство. Мой набор данных - 190 МБ CSV-файла, который при сохранении в виде snappy
сжатого файла паркета заканчивается как один файл размером 3 МБ.
Однако, когда я сохраняю свой набор данных как многораздельные файлы, они приводят к объединению гораздо больших размеров (61 МБ).
Вот пример набора данных, который я пытаюсь сохранить:
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 уникальных значений), размер разделенных файлов составит 61 МБ. Каждый файл имеет размер 168.2kB
. Когда я делю по полу (2 уникальных значения), размер разделенных файлов составляет всего 3 МБ.
Мне интересно, существует ли минимальный размер файла для паркета, чтобы много небольших файлов вместе занимали больше дискового пространства?
Мой env:
- 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())