Feather

Apache Arrow Feather 文件采用列式存储格式,可用于高效存储与提取数据。DolphinDB 提供的 Feather 插件支持高效地将 Feather 文件导入 DolphinDB,或从 DolphinDB 导出 Feather 文件。在导入导出过程中会自动进行数据类型转换。本插件使用了 Arrow 的 arrow 开源库的 feather 读写接口。

在插件市场安装插件

版本要求

DolphinDB Server: 2.00.10及更高版本。支持 Linux x86-64,Windows x86-64。

安装步骤

  1. 在 DolphinDB 客户端中使用 listRemotePlugins 命令查看插件仓库中的插件信息。

    注意:仅展示当前操作系统和 server 版本支持的插件。若无预期插件,可自行编译(请自行选择对应分支下的插件)或在 DolphinDB 用户社区进行反馈。

    login("admin", "123456")
    listRemotePlugins()
  2. 使用 installPlugin 命令完成插件安装。

    installPlugin("feather")
  3. 使用 loadPlugin 命令加载插件。

    loadPlugin("feather")

接口说明

extractSchema

语法

feather::extractSchema(filePath)

详情

读取 Feather 文件数据的表结构。返回一张包含三列的表,第一列 name 是列名,第二列 type 是 Arrow 的数据类型,第三列 DolphinDBType 是转换为 DolphinDB 的数据类型。 注意:如果 DolphinDBType 的某一行是 VOID,则说明 Feather 文件对应的列数据无法导入 DolphinDB。

参数

filePath STRING 类型标量,表示 Feather 文件路径。

例子

feather::extractSchema("path/to/data.feather");
feather::extractSchema("path/to/data.compressed.feather");

load

语法

feather::load(filePath, [columns])

详情

将 Feather 文件数据加载到 DolphinDB 的内存表。Feather 文件中的 Arrow 数据类型与 DolphinDB 数据类型的转化规则,参见数据类型

注意

  1. 由于 DolphinDB 整数类型的最小值表示空值,因此,Arrow int8, Arrow int16, Arrow int32, Arrow int64 类型对应的最小值无法导入 DolphinDB。
  2. 浮点数的正负无穷、nan 值都会被转换为 DolphinDB 中的空值。

参数

filePath STRING 类型标量,表示 Feather 文件路径。

columns 可选参数,STRING 类型向量,表示要读取的列名集合。

例子

table = feather::load("path/to/data.feather");
table_part = feather::load("path/to/data.feather", [ "col1_name","col2_name"]);

save

语法

feather::save(table, filePath, [compressMethod], [compressionLevel])

详情

table 以 Feather 格式保存到文件中。该函数会自动进行数据类型转换,关于 Feather 文件中的 Arrow 数据类型与 DolphinDB 数据类型的转化规则,参见数据类型

参数

table 一个表对象。

filePath STRING 类型标量,表示保存的文件路径。

compression 可选参数,STRING 类型标量,用于指定压缩类型。包含以下三种类型:"uncompressed", "lz4", "zstd",不区分大小写。默认开启 lz4 压缩方式。

compressionLevel 可选参数,整型标量,用于指定压缩级别。仅在 compression="zstd" 时有效。

例子

feather::save(table, "path/to/save/data.feather");
feather::save(table, "path/to/save/data.feather", "lz4");
feather::save(table, "path/to/save/data.feather", "zstd", 2);

完整示例

loadPlugin("feather")
feather::extractSchema("path/to/data.feather");
table = feather::load("path/to/data.feather");
table_part = feather::load("path/to/data.feather", [ "col1_name","col2_name"]);
feather::save(table, "path/to/save/data.feather");
feather::save(table, "path/to/save/data.feather", "lz4");
feather::save(table, "path/to/save/data.feather", "zstd", 2);

支持的数据类型

导入

DolphinDB 导入 Feather 文件时,Arrow 与 DolphinDB 数据类型转换关系如下:

ArrowDolphinDB
boolBOOL
int8CHAR
uint8SHORT
int16SHORT
uint16INT
int32INT
uint32LONG
int64LONG
uint64LONG
floatFLOAT
doubleDOUBLE
stringSTRING
date32DATE
date64TIMESTAMP
timestamp(ms)TIMESTAMP
timestamp(ns)NANOTIMESTAMP
time32(s)SECOND
time32(ms)TIME
time64(ns)NANOTIME

不支持转换以下 Arrow 类型:binary, fixed_size_binary, half_float, timestamp(us), time64(us), interval_months, interval_day_time, decimal128, decimal, decimal256, list, struct, sparse_union, dense_union, dictionary, map, extension, fixed_size_list, large_string, large_binary, large_list, interval_month_day_nano, max_id

导出

从 DolphinDB 导出 Feather 文件时,DolphinDB 与 Arrow 数据类型的对应关系如下:

DolphinDBArrow
BOOLbool
CHARint8
SHORTint16
INTint32
LONGint64
DATEdate32
TIMEtime32(ms)
SECONDtime32(s)
TIMESTAMPtimestamp(ms)
NANOTIMEtime64(ns)
NANOTIMESTAMPtimestamp(ns)
FLOATfloat
DOUBLEdouble
STRINGstring
SYMBOLstring

不支持转换以下 DolphinDB 类型:MINUTE, MONTH, DATETIME, UUID, FUNCTIONDEF, HANDLE, CODE, DATASOURCE, RESOURCE, ANY, COMPRESS, ANY DICTIONARY, DATEHOUR, IPADDR, INT128, BLOB, COMPLEX, POINT, DURATION

Python 读取 Feather 文件

本节介绍通过 Python 读取 Feather 文件时,可能遇到的问题,并给出了相应的解决方案:

  1. Feather 文件中如果包含 time64(ns) 类型的数据,通过 pyarrow.feather.read_feather() 方法读取可能会报错 Value XXXXXXXXXXXXX has non-zero nanoseconds。这是因为 pyarrow.lib.Table 在转换为 DataFrame 时,time64(ns) 类型会被转换为 datetime.time 类型,而后者不支持纳秒精度的时间数据。建议使用 pyarrow.feather.read_table() 方法进行读取。

  2. 通过 pyarrow.feather.read_feather() 读取的 Feather 文件若存在包含空值的整型列,则会把该整型列转成浮点类型。建议先将 Feather 读到 pyarrow table 里,通过指定 types_mapper 转换类型。

    pa_table = feather.read_table("path/to/feather_file")
    df = pa_table.to_pandas(types_mapper={pa.int64(): pd.Int64Dtype()}.get)