羽毛和拼花地板有什么区别?

两者都是用于数据分析系统的 柱状(磁盘)存储格式。 两者都集成在 阿帕奇之箭(用于 python 的 皮罗包)中,并且 设计为与 相对应的柱状内存分析层。

这两种格式有什么不同?

在可能的情况下,与熊猫一起工作时,你应该总是喜欢羽毛吗?

在哪些用例中,羽毛镶木地板和 反过来?


附录

我在这里找到了一些线索, 但是考虑到这个项目的年龄,它可能有点过时了。

这不是一个严肃的速度测试,因为我只是卸载和装载一个整体 数据框架,但给你一些印象,如果你从来没有 以前听说过的格式:

 # 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
57139 次浏览
  • Parquet 格式是为长期存储而设计的,其中 Arrow 更适合短期存储或短暂存储(Arrow 可能更适合在1.0.0发布之后进行长期存储,因为二进制格式在那时将是稳定的)

  • 实木复合地板是更昂贵的编写比羽毛,因为它具有更多的编码和压缩层。羽毛是未修改的原始柱状箭头存储器。将来我们可能会向 Father 添加简单的压缩。

  • 由于字典编码、 RLE 编码和数据页压缩,Parquet 文件通常要比 Father 文件小得多

  • Parquet 是一种标准的分析存储格式,得到了许多不同系统的支持: Spark、 Hive、 Impala、各种 AWS 服务,未来还有 BigQuery 等。因此,如果你正在做分析,Parquet 是一个很好的选择作为参考存储格式的查询多个系统

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

希望这个能帮上忙

我还将包括在实木地板和羽毛之间的比较不同的压缩方法,以检查进出口速度和它使用了多少存储空间。

对于那些想要一个更好的 csv 替代品的普通用户,我主张有两种选择:

  • 带有“ gzip”压缩的 parquet (用于存储) : 导出速度稍微快一点。Csv (如果需要压缩 csv,那么拼花地板会快得多)。导入速度大约是 csv 的2倍。压缩比原始文件大小大约减少了22% ,这与压缩后的 csv 文件大致相同。
  • 带“ zstd”压缩的羽毛(I/O 速度) : 与 csv 相比,羽毛导出速度快20倍,导入速度快6倍。存储大约是32% 的原始文件大小,这是10% 比拼花“ gzip”和 csv 压缩,但仍然不错。

对于所有类别(I/O 速度和存储)的普通 csv 文件来说,两者都是更好的选择。

我分析了以下格式:

  1. CSV
  2. 使用“ zip”压缩的 csv
  3. 使用“ zstd”压缩的羽毛
  4. 使用“ lz4”压缩羽毛
  5. 拼花地板采用“快速”压缩
  6. 使用“ gzip”压缩拼花地板
  7. 拼花地板用的是“ gzip”布洛特利

import zipfile
import pandas as pd
folder_path = (r"...\\intraday")
zip_path = zipfile.ZipFile(folder_path + "\\AAPL.zip")
test_data = pd.read_csv(zip_path.open('AAPL.csv'))




# EXPORT, STORAGE AND IMPORT TESTS
# ------------------------------------------
# - FORMAT .csv


# export
%%timeit
test_data.to_csv(folder_path + "\\AAPL.csv", index=False)
# 12.8 s ± 399 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


# storage
# AAPL.csv exported using python.
# 169.034 KB


# import
%%timeit
test_data = pd.read_csv(folder_path + "\\AAPL.csv")
# 1.56 s ± 14.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


# ------------------------------------------
# - FORMAT zipped .csv


# export
%%timeit
test_data.to_csv(folder_path + "\\AAPL.csv")
# 12.8 s ± 399 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# OBSERVATION: this does not include the time I spent manually zipping the .csv


# storage
# AAPL.csv zipped with .zip "normal" compression using 7-zip software.
# 36.782 KB


# import
zip_path = zipfile.ZipFile(folder_path + "\AAPL.zip")
%%timeit
test_data = pd.read_csv(zip_path.open('AAPL.csv'))
# 2.31 s ± 43.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


# ------------------------------------------
# - FORMAT .feather using "zstd" compression.


# export
%%timeit
test_data.to_feather(folder_path + "\\AAPL.feather", compression='zstd')
# 460 ms ± 13.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


# storage
# AAPL.feather exported with python using zstd
# 54.924 KB


# import
%%timeit
test_data = pd.read_feather(folder_path + "\\AAPL.feather")
# 310 ms ± 11.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


# ------------------------------------------
# - FORMAT .feather using "lz4" compression.
# Only works installing with pip, not with conda. Bad sign.


# export
%%timeit
test_data.to_feather(folder_path + "\\AAPL.feather", compression='lz4')
# 392 ms ± 14.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


# storage
# AAPL.feather exported with python using "lz4"
# 79.668 KB


# import
%%timeit
test_data = pd.read_feather(folder_path + "\\AAPL.feather")
# 255 ms ± 4.79 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


# ------------------------------------------
# - FORMAT .parquet using compression "snappy"


# export
%%timeit
test_data.to_parquet(folder_path + "\\AAPL.parquet", compression='snappy')
# 2.82 s ± 47.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


# storage
# AAPL.parquet exported with python using "snappy"
# 62.383 KB


# import
%%timeit
test_data = pd.read_parquet(folder_path + "\\AAPL.parquet")
# 701 ms ± 19.8 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


# ------------------------------------------
# - FORMAT .parquet using compression "gzip"


# export
%%timeit
test_data.to_parquet(folder_path + "\\AAPL.parquet", compression='gzip')
# 10.8 s ± 77.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


# storage
# AAPL.parquet exported with python using "gzip"
# 37.595 KB


# import
%%timeit
test_data = pd.read_parquet(folder_path + "\\AAPL.parquet")
# 1.18 s ± 80.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)


# ------------------------------------------
# - FORMAT .parquet using compression "brotli"


# export
%%timeit
test_data.to_parquet(folder_path + "\\AAPL.parquet", compression='brotli')
# around 5min each loop. I did not run %%timeit on this one.


# storage
# AAPL.parquet exported with python using "brotli"
# 29.425 KB


# import
%%timeit
test_data = pd.read_parquet(folder_path + "\\AAPL.parquet")
# 1.04 s ± 72 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

观察结果:

  • 羽毛似乎更适合轻量级数据,因为它写入和加载速度更快。实木地板有更好的存储比率。
  • 羽毛库的支持和维护最初让我很担心,但是文件格式与熊猫有很好的集成,我可以使用“ zstd”压缩方法的 conda安装依赖项。
  • 到目前为止最好的存储是实木地板与“布罗特利”压缩,但它需要长期出口。它有一个良好的进口速度一旦出口完成,但仍然是2.5倍进口比羽毛。