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 默认使用(如果通过正常的包管理器获取 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 压缩通常会生成小得多的文件,而不会牺牲太多读写性能。在某些情况下,由于减少了磁盘 IO 需求,LZ4 压缩文件的读写速度可能比未压缩文件更快。

写入版本 1 (V1) 文件#

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