Feather 文件格式#

Feather 是一种用于存储 Arrow 表格或数据帧(来自 Python 或 R 等语言)的可移植文件格式,它在内部利用了 Arrow IPC 格式。Feather 是在 Arrow 项目的早期作为概念验证创建的,用于为 Python(pandas)和 R 提供快速、与语言无关的数据帧存储。Feather 有两个文件格式版本

  • 版本 2 (V2),默认版本,在磁盘上完全表示为 Arrow IPC 文件格式。V2 文件支持存储所有 Arrow 数据类型以及使用 LZ4 或 ZSTD 压缩。V2 最初在 Apache Arrow 0.17.0 中可用。

  • 版本 1 (V1),从 2016 年开始提供的旧版本,已被 V2 替换。V1 文件与 Arrow IPC 文件不同,并且缺少许多功能,例如存储所有 Arrow 数据类型的能力。V1 文件也缺乏压缩支持。我们打算在可预见的未来保持对 V1 的读取支持。

pyarrow.feather 模块包含了该格式的读写函数。 write_feather() 接受 Tablepandas.DataFrame 对象。

import pyarrow.feather as feather
feather.write_feather(df, '/path/to/file')

read_feather() 将 Feather 文件读取为 pandas.DataFrameread_table() 将 Feather 文件读取为 Table。在内部,read_feather() 只是简单地调用 read_table(),并将结果转换为 pandas。

# Result is pandas.DataFrame
read_df = feather.read_feather('/path/to/file')

# Result is pyarrow.Table
read_arrow = feather.read_table('/path/to/file')

这些函数可以读取和写入文件路径或类文件对象。例如:

with open('/path/to/file', 'wb') as f:
    feather.write_feather(df, f)

with open('/path/to/file', 'rb') as f:
    read_df = feather.read_feather(f)

输入到 read_feather 的文件必须支持查找。

使用压缩#

从 Apache Arrow 0.17.0 版本开始,Feather V2 文件(默认版本)支持两个快速的压缩库:LZ4(使用帧格式)和 ZSTD。如果 LZ4 可用,则默认使用 LZ4(如果您通过正常的包管理器获取了 pyarrow,则应该可用)。

# Uses LZ4 by default
feather.write_feather(df, file_path)

# Use LZ4 explicitly
feather.write_feather(df, file_path, compression='lz4')

# Use ZSTD
feather.write_feather(df, file_path, compression='zstd')

# Do not compress
feather.write_feather(df, file_path, compression='uncompressed')

请注意,默认的 LZ4 压缩通常会产生更小的文件,而不会牺牲太多读取或写入性能。在某些情况下,由于减少了磁盘 I/O 需求,LZ4 压缩文件读取和写入的速度可能比未压缩文件更快。

写入版本 1 (V1) 文件#

为了与不支持版本 2 文件的库兼容,您可以通过将 version=1 传递给 write_feather 来写入版本 1 格式。我们打算在可预见的未来继续维护对 V1 的读取支持。