两者都是 列式(磁盘)存储格式 用于数据分析系统。
两者都集成在 Apache Arrow(python 的 pyarrow 包)中,并且是
设计为与 Arrow 对应作为柱状内存分析层。

两种格式有何不同?

在可能的情况下,与 Pandas 一起工作时,您是否应该总是喜欢 Feather ?

featherparquet 更适合的用例是什么?
另一边?

附录

我在这里找到了一些提示 https://github.com/wesm/feather/issues/188
但考虑到这个项目的年轻,它可能有点过时了。

不是一个严肃的速度测试,因为我只是倾倒和加载一个整体
Dataframe 但如果你从来没有给你一些印象
之前听说过以下格式:

 # 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

最佳答案

  • Parquet 格式专为长期存储而设计,其中 Arrow 更适合短期或临时存储(Arrow 可能更适合在 1.0.0 发布后长期存储,因为那时二进制格式将稳定)
  • Parquet 比 Feather 更昂贵,因为它具有更多的编码和压缩层。 Feather 是未经修改的原始柱状 Arrow 内存。将来我们可能会为 Feather 添加简单的压缩。
  • 由于字典编码、RLE 编码和数据页压缩,Parquet 文件通常会比 Feather 文件小很多
  • Parquet 是许多不同系统支持的分析标准存储格式:Spark、Hive、Impala、各种 AWS 服务, future 由 BigQuery 等。因此,如果您正在进行分析,Parquet 是作为引用存储格式的不错选择多系统查询

  • 您展示的基准测试将非常嘈杂,因为您读取和写入的数据非常小。您应该尝试压缩至少 100MB 或以上 1GB 的数据以获得一些更多信息的基准,例如参见http://wesmckinney.com/blog/python-parquet-multithreading/

    希望这可以帮助

    关于python - Feather 和 Parquet 有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48083405/

    10-16 02:53