#arrow #prost #protobuf #grpc #rpc

prost-arrow-derive

提供prost-arrow的进程宏,可以在prost生成的消息上派生ToArrow特质

3个版本

0.0.3 2024年3月29日
0.0.2 2024年3月29日
0.0.1 2024年3月27日

68 in #prost


prost-arrow中使用

Apache-2.0

15KB
245

ci Documentation Crate

PROST! Apache Arrow支持

prost-arrow 提供了一个 derive 特质,可以用来为使用 prost 生成的任何 protobuf 类型生成 arrow 数组构建器。

用法

此crate提供了 ToArrow 特质和一个派生它的进程宏。它必须在 所有 消息上派生,因此我们将其作为 type_attribute 添加,使用通配符路径 "."。生成的 impls 依赖于 prost-arrow crate 以及几个 arrow crate。

您需要在您的Cargo.toml中添加以下依赖项

arrow-array
arrow-buffer
arrow-schema
prost-arrow

在您的构建脚本中

// prost
prost_build::Config::new()
    .type_attribute(".", "#[derive(::prost_arrow::ToArrow)]")
    .compile_protos(&["proto/routeguide/route_guide.proto"], &["proto/"])
    .unwrap();

// tonic
tonic_build::configure()
    .type_attribute(".", "#[derive(::prost_arrow::ToArrow)]")
    .compile(&["proto/routeguide/route_guide.proto"], &["proto"])
    .unwrap();

最后,要访问生成的prost类型数组的构建器,我们使用 prost_arrow::new_builder<T>,其中 T 是某个具有派生 ToArrow 类型的prost生成的类型。返回的构建器将实现基础 arrow_builder::Builder 特质,但还将具有接受我们的prost类型 Tappend_valueappend_option 方法。

// required trait imports
use arrow_array::builder::ArrayBuilder;
use prost_arrow::{ArrowBuilder, ToArrow};

// Rectangle is a prost-generated struct that has ToArrow derived.
let mut builder = prost_arrow::new_builder::<Rectangle>();

builder.append_value(Rectangle {
    lo: Some(pt_1),
    hi: None,
    messages: vec!["one".to_string(), "two".to_string()],
    extra_points: vec![
        Point {
            latitude: 1,
            longitude: 2,
        },
        Point {
            latitude: 3,
            longitude: 4,
        },
    ],
    binary: vec![0, 1, 2, 3],
    repeated_binary: vec![vec![10, 100]],
});

构建器可以像任何其他arrow构建器实现类型一样使用,因此可以使用 finishfinish_cloned 方法最终确定arrow数组(在我们的情况下,是一个结构体数组)。

// finish the array builder to get an ArrayRef
let arr = builder.finish();

// downcast the array into StructArray
let struct_arr = arr.as_any().downcast_ref::<StructArray>().unwrap();

// convert to RecordBatch if desired
let record_batch: RecordBatch = struct_arr.into();

完整性

功能 支持
基本类型
重复字段
可选字段(通过 optional
可选字段(通过包装类型) 🚧
已知类型(例如时间戳) 🚧
oneof字段 🚧
映射字段 🚧
嵌套消息
递归/循环消息

依赖关系

~270–720KB
~17K SLoC