69个版本 (重大变更)

52.2.0 2024年7月28日
52.0.0 2024年6月6日
51.0.0 2024年3月18日
50.0.0 2024年1月12日
3.0.0 2021年1月26日

#1096过程宏

Download history 558/week @ 2024-04-29 487/week @ 2024-05-06 593/week @ 2024-05-13 1084/week @ 2024-05-20 475/week @ 2024-05-27 1521/week @ 2024-06-03 2379/week @ 2024-06-10 2862/week @ 2024-06-17 3549/week @ 2024-06-24 3940/week @ 2024-07-01 4862/week @ 2024-07-08 3394/week @ 2024-07-15 2716/week @ 2024-07-22 2538/week @ 2024-07-29 3026/week @ 2024-08-05 4066/week @ 2024-08-12

每月12,582次下载
用于 2 crate

Apache-2.0

2.5MB
55K SLoC

Parquet Derive

一个用于派生任意、简单的结构体的 RecordWriterRecordReader 的crate。这不会为任意嵌套的结构体生成读取器或写入器。它仅适用于原始类型和一些泛型结构和各种引用级别。请参阅功能清单以了解目前支持的内容。

Derive还支持chrono时间库。您必须启用chrono功能才能获得此支持。

用法

将此添加到您的Cargo.toml中

[dependencies]
parquet = "39.0.0"
parquet_derive = "39.0.0"

并将其添加到您的crate根目录中

extern crate parquet;
#[macro_use] extern crate parquet_derive;

为您的结构体派生RecordWriter的示例用法

use parquet;
use parquet::record::RecordWriter;

#[derive(ParquetRecordWriter)]
struct ACompleteRecord<'a> {
    pub a_bool: bool,
    pub a_str: &'a str,
    pub a_string: String,
    pub a_borrowed_string: &'a String,
    pub maybe_a_str: Option<&'a str>,
    pub magic_number: i32,
    pub low_quality_pi: f32,
    pub high_quality_pi: f64,
    pub maybe_pi: Option<f32>,
    pub maybe_best_pi: Option<f64>,
}

// Initialize your parquet file
let mut writer = SerializedFileWriter::new(file, schema, props).unwrap();
let mut row_group = writer.next_row_group().unwrap();

// Build up your records
let chunks = vec![ACompleteRecord{...}];

// The derived `RecordWriter` takes over here
(&chunks[..]).write_to_row_group(&mut row_group);

writer.close_row_group(row_group).unwrap();
writer.close().unwrap();

为您的结构体派生RecordReader的示例用法

use parquet::file::{serialized_reader::SerializedFileReader, reader::FileReader};
use parquet_derive::ParquetRecordReader;

#[derive(ParquetRecordReader)]
struct ACompleteRecord {
    pub a_bool: bool,
    pub a_string: String,
    pub i16: i16,
    pub i32: i32,
    pub u64: u64,
    pub isize: isize,
    pub float: f32,
    pub double: f64,
    pub now: chrono::NaiveDateTime,
    pub byte_vec: Vec<u8>,
}

// Initialize your parquet file
let reader = SerializedFileReader::new(file).unwrap();
let mut row_group = reader.get_row_group(0).unwrap();

// create your records vector to read into
let mut chunks: Vec<ACompleteRecord> = Vec::new();

// The derived `RecordReader` takes over here
chunks.read_from_row_group(&mut *row_group, 1).unwrap();

特性

  • 支持写入String&strbooli32f32f64Vec<u8>

  • 支持写入字典

  • 支持写入逻辑类型,如时间戳

  • 为写入Option派生definition_levels

  • 为写入嵌套结构派生definition levels

  • 派生写入tuple结构体

  • 派生写入tuple容器类型

  • 支持读取 String&strbooli32f32f64Vec<u8>

  • 支持读取/写入字典

  • 支持读取/写入类似时间戳的逻辑类型

  • 处理读取时 Option 的 definition_levels

  • 处理读取时嵌套结构的 definition levels

  • 推导读取/写入元组结构

  • 推导读取/写入 tuple 容器类型

要求

  • parquet-rs 相同

测试

测试 *_derive 需要一个中间的 crate。前往 parquet_derive_test 并运行 cargo test 执行单元测试。

文档

要构建文档,运行 cargo doc --no-deps。要编译并在浏览器中查看,运行 cargo doc --no-deps --open

许可证

根据 Apache License,版本 2.0 许可:http://www.apache.org/licenses/LICENSE-2.0.

依赖

约 4-10MB
约 96K SLoC