Feather

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

在插件市场安装插件

版本要求

  • DolphinDB Server: 2.00.10及更高版本
  • 64 位 Linux 或 Windows 操作系统

安装步骤

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

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

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

    loadPlugin("feather")

接口说明

feather::extractSchema

语法

feather::extractSchema(filePath)

参数

  • filePath:Feather 文件路径,类型为字符串标量。

详情

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

例子

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

feather::load

语法

feather::load(filePath, [columns])

参数

  • filePath:Feather 文件路径,类型为字符串标量。
  • columns:可选参数,字符串向量,表示要读取的列名集合。

详情

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

注意

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

例子

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

feather::save

语法

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

参数

  • table:一个表对象。
  • filePath:保存的文件路径,类型为字符串标量。
  • compression:可选参数,类型为字符串标量,用于指定压缩类型。包含以下三种类型:"uncompressed", "lz4", "zstd",不区分大小写。默认开启 lz4 压缩方式。
  • compressionLevel:可选参数,类型为整型标量,用于指定压缩级别。仅在 compression="zstd" 时有效。

详情

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

例子

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("/path/to/plugins/feather/PluginFeather.txt")
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)