Apa perbedaan antara Feather dan Parket?

95

Keduanya adalah format penyimpanan berbentuk kolom (disk-) untuk digunakan dalam sistem analisis data. Keduanya terintegrasi dalam Apache Arrow ( paket pyarrow untuk python) dan dirancang agar sesuai dengan Arrow sebagai lapisan analitik dalam memori berbentuk kolom.

Apa perbedaan kedua format?

Haruskah Anda selalu memilih bulu saat menangani panda jika memungkinkan?

Apa kasus penggunaan di mana bulu lebih cocok daripada parket dan sebaliknya?


Lampiran

Saya menemukan beberapa petunjuk di sini https://github.com/wesm/feather/issues/188 , tetapi mengingat usia muda dari proyek ini, mungkin itu agak ketinggalan zaman.

Bukan tes kecepatan yang serius karena saya hanya membuang dan memuat seluruh Dataframe tetapi untuk memberi Anda kesan jika Anda belum pernah mendengar format sebelumnya:

 # IPython    
import numpy as np
import pandas as pd
import pyarrow as pa
import pyarrow.feather as feather
import pyarrow.parquet as pq
import fastparquet as fp


df = pd.DataFrame({'one': [-1, np.nan, 2.5],
                   'two': ['foo', 'bar', 'baz'],
                   'three': [True, False, True]})

print("pandas df to disk ####################################################")
print('example_feather:')
%timeit feather.write_feather(df, 'example_feather')
# 2.62 ms ± 35.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
print('example_parquet:')
%timeit pq.write_table(pa.Table.from_pandas(df), 'example.parquet')
# 3.19 ms ± 51 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
print()

print("for comparison:")
print('example_pickle:')
%timeit df.to_pickle('example_pickle')
# 2.75 ms ± 18.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
print('example_fp_parquet:')
%timeit fp.write('example_fp_parquet', df)
# 7.06 ms ± 205 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
print('example_hdf:')
%timeit df.to_hdf('example_hdf', 'key_to_store', mode='w', table=True)
# 24.6 ms ± 4.45 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
print()

print("pandas df from disk ##################################################")
print('example_feather:')
%timeit feather.read_feather('example_feather')
# 969 µs ± 1.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
print('example_parquet:')
%timeit pq.read_table('example.parquet').to_pandas()
# 1.9 ms ± 5.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

print("for comparison:")
print('example_pickle:')
%timeit pd.read_pickle('example_pickle')
# 1.07 ms ± 6.21 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
print('example_fp_parquet:')
%timeit fp.ParquetFile('example_fp_parquet').to_pandas()
# 4.53 ms ± 260 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
print('example_hdf:')
%timeit pd.read_hdf('example_hdf')
# 10 ms ± 43.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# pandas version: 0.22.0
# fastparquet version: 0.1.3
# numpy version: 1.13.3
# pandas version: 0.22.0
# pyarrow version: 0.8.0
# sys.version: 3.6.3
# example Dataframe taken from https://arrow.apache.org/docs/python/parquet.html
Darkonaut
sumber

Jawaban:

136
  • Format parket dirancang untuk penyimpanan jangka panjang, di mana Panah lebih ditujukan untuk penyimpanan jangka pendek atau sementara (Panah mungkin lebih cocok untuk penyimpanan jangka panjang setelah rilis 1.0.0 terjadi, karena format biner akan stabil saat itu)

  • Parket lebih mahal untuk ditulis daripada Feather karena memiliki lebih banyak lapisan pengkodean dan kompresi. Feather adalah memori Arrow kolom mentah yang tidak dimodifikasi. Kami mungkin akan menambahkan kompresi sederhana ke Feather di masa mendatang.

  • Karena pengkodean kamus, pengkodean RLE, dan kompresi halaman data, file Parquet seringkali jauh lebih kecil daripada file Feather

  • Parket adalah format penyimpanan standar untuk analitik yang didukung oleh banyak sistem berbeda: Spark, Hive, Impala, berbagai layanan AWS, di masa mendatang oleh BigQuery, dll. Jadi, jika Anda melakukan analitik, Parquet adalah pilihan yang baik sebagai format penyimpanan referensi untuk kueri dengan banyak sistem

Tolok ukur yang Anda tunjukkan akan sangat berisik karena data yang Anda baca dan tulis sangat kecil. Anda harus mencoba mengompresi setidaknya 100MB atau lebih tinggi 1GB data untuk mendapatkan beberapa tolok ukur yang lebih informatif, lihat misalnya http://wesmckinney.com/blog/python-parquet-multithreading/

Semoga ini membantu

Wes McKinney
sumber
3
Ya, "tidak terkompresi" akan selalu menjadi pilihan
Wes McKinney
1
Saya perhatikan bahwa generate_floatsfungsi Anda dalam kode patokan Anda di sini wesmckinney.com/blog/python-parquet-update tidak menjamin unique_values. Mereka hanya acak. Dengan n = 100M saya mendapat duplikat dua dari sepuluh putaran. Hanya menyebutkan jika seseorang menggunakan fungsi ini di mana keunikan harus dijamin.
Darkonaut
1
@Darkonaut hanya ingin tahu ... hasil kompresi dalam ukuran yang lebih kecil sehingga akan lebih cepat untuk membacanya ke dalam memori. Bisa jadi pemrosesan ekstra akibat kompresi / dekompresi akan tetap lebih cepat daripada harus membaca lebih banyak byte. Atau apakah Anda memiliki situasi yang tidak saya pikirkan?
PascalVKooten
2
HDF5 lebih umum dan berat ... juga jauh lebih lambat di sebagian besar waktu.
ivo Welch
4
@WesMcKinney Saya melihat jawaban Anda ditulis kembali pada tahun 2018. Setelah 2,3 tahun, apakah menurut Anda Panah (bulu) tidak baik untuk penyimpanan jangka panjang (dengan membandingkan dengan Parquet)? Apakah ada alasan khusus? Suka stabilitas? evolusi format? atau?
HCSF