#arrow #deserialize #array #object #serde-derive #convert #format

serde_arrow

将Rust对象的序列转换为Arrow数组并返回

29次发布

0.11.6 2024年6月13日
0.11.4 2024年5月27日
0.10.1-rc.12024年3月6日
0.9.0-rc.12023年11月1日
0.2.0 2021年8月4日

115编码 中排名

Download history 1274/week @ 2024-05-03 1292/week @ 2024-05-10 1801/week @ 2024-05-17 1649/week @ 2024-05-24 1962/week @ 2024-05-31 3292/week @ 2024-06-07 3976/week @ 2024-06-14 4472/week @ 2024-06-21 5174/week @ 2024-06-28 4988/week @ 2024-07-05 3012/week @ 2024-07-12 2614/week @ 2024-07-19 1954/week @ 2024-07-26 2630/week @ 2024-08-02 2926/week @ 2024-08-09 1788/week @ 2024-08-16

9,803 每月下载量
5 包中(4个直接使用)

MIT 许可证

780KB
19K SLoC

serde_arrow - 将Rust对象的序列转换为Arrow数组并返回

包信息 | API文档 | 示例 | 相关包和性能 | 状态 | 许可证 | 变更 | 开发

内存中的arrow格式是一种强大的方式来处理类似数据框的结构。周围的生态系统包括丰富的库,从数据框如 Polars 到查询引擎如 DataFusion。然而,由于Rust的静态类型性质,底层的Rust包的API有时使用起来可能会有些繁琐。

serde_arrow 提供了一种简单的方法将Rust对象转换为Arrow数组并返回。 serde_arrow 依赖于 Serde 包来解释Rust对象。因此,将 serde_arrow 添加到自定义类型支持就像使用Serde的derive宏一样简单。

在Rust生态系统中有两种相互竞争的内存中arrow格式的实现。 serde_arrow 支持用于模式追踪、从Rust结构到数组的序列化和从数组到Rust结构的反序列化的 arrowarrow2

示例

以下示例假设已经将 serde_arrow 添加到 Cargo.toml 文件中,并配置了其功能。 serde_arrow 支持不同的 arrowarrow2 版本。可以通过指定正确的功能来选择相关版本(例如,使用 arrow-51 支持箭头版本 arrow=51)。更多详情请见这里

以下示例使用以下 Rust 结构和示例记录

#[derive(Serialize, Deserialize)]
struct Record {
    a: f32,
    b: i32,
}

let records = vec![
    Record { a: 1.0, b: 1 },
    Record { a: 2.0, b: 2 },
    Record { a: 3.0, b: 3 },
];

序列化为 arrow RecordBatch

use arrow::datatypes::FieldRef;
use serde_arrow::schema::{SchemaLike, TracingOptions};

// Determine Arrow schema
let fields = Vec::<FieldRef>::from_type::<Record>(TracingOptions::default())?;

// Build a record batch
let batch = serde_arrow::to_record_batch(&fields, &records)?;

现在可以使用来自 parquet crate 的 ArrowWriter 将这个 RecordBatch 写入磁盘。

let file = File::create("example.pq");
let mut writer = ArrowWriter::try_new(file, batch.schema(), None)?;
writer.write(&batch)?;
writer.close()?;

序列化为 arrow2 数组

use arrow2::datatypes::Field;
use serde_arrow::schema::{SchemaLike, TracingOptions};

let fields = Vec::<Field>::from_type::<Record>(TracingOptions::default())?;
let arrays = serde_arrow::to_arrow2(&fields, &records)?;

现在可以使用 arrow2 指南中定义的辅助方法将这些数组写入磁盘。对于 parquet

use arrow2::{chunk::Chunk, datatypes::Schema};

// see https://jorgecarleitao.github.io/arrow2/io/parquet_write.html
write_chunk(
    "example.pq",
    Schema::from(fields),
    Chunk::new(arrays),
)?;

Python 中的使用

可以通过以下方式在 Python 中读取写入的文件

# using polars
>>> import polars as pl
>>> pl.read_parquet("example.pq")
shape: (3, 2)
┌─────┬─────┐
│ a   ┆ b   │
│ --- ┆ --- │
│ f32 ┆ i32 │
╞═════╪═════╡
│ 1.0 ┆ 1   │
│ 2.0 ┆ 2   │
│ 3.0 ┆ 3   │
└─────┴─────┘

# using pandas
>>> import pandas as pd
>>> pd.read_parquet("example.pq")
     a  b
0  1.0  1
1  2.0  2
2  3.0  3
  • arrow: 官方 Arrow 包的 JSON 组件支持通过 Decoder 对象序列化支持序列化的对象。它支持基本类型、结构体和列表
  • arrow2-convert: 为从箭头2数组转换对象和从对象到箭头2数组添加 derive 宏。它支持基本类型、结构体、列表和 chrono 的日期时间类型。枚举支持是实验性的,如 Readme 所述。如果性能是主要目标,arrow2-convert 是一个好的选择,因为它在手动构建数组时没有或最小化开销。

与其他实现相比,以下性能差异

Time

以下列出了 基准测试 的详细运行时间。

complex_common_serialize(100000)

标签 时间 [ms] arrow2_convert serde_arrow::to serde_arrow::to arrow_json::Rea
arrow2_convert::TryIntoArrow 54.01 1.00 0.31 0.30 0.14
serde_arrow::to_arrow2 173.84 3.22 1.00 0.98 0.46
serde_arrow::to_arrow 177.92 3.29 1.02 1.00 0.47
arrow_json::ReaderBuilder 378.48 7.01 2.18 2.13 1.00

complex_common_serialize(1000000)

标签 时间 [ms] arrow2_convert serde_arrow::to serde_arrow::to arrow_json::Rea
arrow2_convert::TryIntoArrow 576.81 1.00 0.34 0.33 0.16
serde_arrow::to_arrow2 1701.46 2.95 1.00 0.97 0.46
serde_arrow::to_arrow 1748.89 3.03 1.03 1.00 0.48
arrow_json::ReaderBuilder 3676.51 6.37 2.16 2.10 1.00

primitives_serialize(100000)

标签 时间 [ms] arrow2_convert serde_arrow::to serde_arrow::to arrow_json::Rea
arrow2_convert::TryIntoArrow 15.83 1.00 0.51 0.36 0.12
serde_arrow::to_arrow2 30.90 1.95 1.00 0.70 0.23
serde_arrow::to_arrow 43.96 2.78 1.42 1.00 0.33
arrow_json::ReaderBuilder 133.97 8.46 4.34 3.05 1.00

primitives_serialize(1000000)

标签 时间 [ms] arrow2_convert serde_arrow::to serde_arrow::to arrow_json::Rea
arrow2_convert::TryIntoArrow 153.07 1.00 0.47 0.35 0.11
serde_arrow::to_arrow2 327.32 2.14 1.00 0.74 0.23
serde_arrow::to_arrow 440.39 2.88 1.35 1.00 0.31
arrow_json::ReaderBuilder 1429.31 9.34 4.37 3.25 1.00

许可证

Copyright (c) 2021 - 2024 Christopher Prohm and contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

依赖项

~1.7–9MB
~85K SLoC