Rust箭头数据处理库re_arrow_util的使用,高效处理列式内存格式与数据转换

Rust箭头数据处理库re_arrow_util的使用,高效处理列式内存格式与数据转换

re_arrow_util是rerun系列crate的一部分,提供了处理Apache Arrow数据的辅助工具。

安装

在Cargo.toml中添加依赖:

re_arrow_util = "0.24.1"

或者运行命令:

cargo add re_arrow_util

使用示例

以下是一个使用re_arrow_util处理列式内存数据的完整示例:

use arrow_array::{ArrayRef, Int32Array, RecordBatch};
use arrow_schema::{DataType, Field, Schema};
use re_arrow_util::arrow_util;

fn main() {
    // 创建Arrow数组
    let array1 = Int32Array::from(vec![1, 2, 3, 4, 5]);
    let array2 = Int32Array::from(vec![6, 7, 8, 9, 10]);
    
    // 将数组转换为ArrayRef
    let arrays: Vec<ArrayRef> = vec![
        std::sync::Arc::new(array1),
        std::sync::Arc::new(array2),
    ];
    
    // 定义schema
    let schema = Schema::new(vec![
        Field::new("col1", DataType::Int32, false),
        Field::new("col2", DataType::Int32, false),
    ]);
    
    // 创建RecordBatch
    let record_batch = RecordBatch::try_new(
        std::sync::Arc::new(schema),
        arrays
    ).unwrap();
    
    // 使用re_arrow_util工具处理数据
    // 示例:计算列的总和
    let col1_sum = arrow_util::sum_array(record_batch.column(0)).unwrap();
    let col2_sum = arrow_util::sum_array(record_batch.column(1)).unwrap();
    
    println!("Column 1 sum: {}", col1_sum);
    println!("Column 2 sum: {}", col2_sum);
    
    // 其他可能的操作包括:
    // - 数据转换
    // - 内存优化
    // - 批处理操作
}

完整示例扩展

下面是一个更完整的示例,展示re_arrow_util的更多功能:

use arrow_array::{ArrayRef, Int32Array, Float64Array, RecordBatch};
use arrow_schema::{DataType, Field, Schema};
use re_arrow_util::arrow_util;

fn main() {
    // 创建不同类型的Arrow数组
    let int_array = Int32Array::from(vec![1, 2, 3, 4, 5]);
    let float_array = Float64Array::from(vec![1.1, 2.2, 3.3, 4.4, 5.5]);
    
    // 将数组转换为ArrayRef
    let arrays: Vec<ArrayRef> = vec![
        std::sync::Arc::new(int_array),
        std::sync::Arc::new(float_array),
    ];
    
    // 定义schema
    let schema = Schema::new(vec![
        Field::new("integers", DataType::Int32, false),
        Field::new("floats", DataType::Float64, false),
    ]);
    
    // 创建RecordBatch
    let record_batch = RecordBatch::try_new(
        std::sync::Arc::new(schema),
        arrays
    ).unwrap();
    
    // 使用re_arrow_util工具处理数据
    // 计算列的总和
    let int_sum = arrow_util::sum_array(record_batch.column(0)).unwrap();
    let float_sum = arrow_util::sum_array(record_batch.column(1)).unwrap();
    
    println!("Integer column sum: {}", int_sum);
    println!("Float column sum: {}", float_sum);
    
    // 计算平均值
    let int_avg = arrow_util::mean_array(record_batch.column(0)).unwrap();
    let float_avg = arrow_util::mean_array(record_batch.column(1)).unwrap();
    
    println!("Integer column average: {}", int_avg);
    println!("Float column average: {}", float_avg);
    
    // 数据转换示例
    let converted = arrow_util::cast_array(
        record_batch.column(1),
        &DataType::Int32
    ).unwrap();
    
    println!("Converted float to int: {:?}", converted);
}

功能特点

  1. 提供高效的列式内存数据处理
  2. 支持Apache Arrow格式的数据转换
  3. 包含常用的数据处理工具函数
  4. MIT或Apache-2.0双协议授权

文档

更多详细用法请参考官方文档。


1 回复

Rust箭头数据处理库re_arrow_util使用指南

介绍

re_arrow_util是Rust生态中一个高效处理Apache Arrow列式内存格式的实用工具库,它构建在arrow2库之上,专注于提供高性能的数据转换和处理能力。该库特别适合需要处理大规模结构化数据的场景,如数据分析、数据仓库和OLAP系统。

主要特性

  • 高效的列式内存操作
  • 丰富的数据类型支持
  • 低开销的数据转换
  • 与Arrow生态系统无缝集成
  • 优化的内存管理

安装

在Cargo.toml中添加依赖:

[dependencies]
re_arrow_util = "0.9"
arrow2 = "0.17"

基本使用方法

1. 创建数组

use re_arrow_util::array::{ArrayBuilder, Int32ArrayBuilder};

let mut builder = Int32ArrayBuilder::new();
builder.append_value(1);
builder.append_value(2);
builder.append_null();
builder.append_value(4);

let array = builder.finish();
println!("{:?}", array);

2. 数据类型转换

use re_arrow_util::cast::{as_primitive_array, as_string_array};
use arrow2::array::{Int32Array, Utf8Array};

let int_array = Int32Array::from(vec![Some(1), None, Some(3)]);
let str_array: Utf8Array<i32> = re_arrow_util::cast::cast(&int_array).unwrap();
println!("{:?}", str_array);

3. 高效数据批处理

use re_arrow_util::record_batch::RecordBatch;
use arrow2::datatypes::{DataType, Field, Schema};

let schema = Schema::from(vec![
    Field::new("id", DataType::Int32, false),
    Field::new("name", DataType::Utf8, true),
]);

let id_array = Int32Array::from(vec![1, 2, 3]);
let name_array = Utf8Array::<i32>::from(vec![Some("Alice"), None, Some("Bob")]);

let batch = RecordBatch::try_new(
    schema,
    vec![Box::new(id_array), Box::new(name_array)],
).unwrap();

println!("Batch has {} rows", batch.num_rows());

4. 内存优化操作

use re_arrow_util::memory;
use arrow2::array::Int32Array;

let array = Int32Array::from(vec![1, 2, 3, 4, 5]);
let memory_usage = memory::total_bytes(&array);
println!("Array uses {} bytes", memory_usage);

5. 数据过滤

use re_arrow_util::filter;
use arrow2::array::{Int32Array, BooleanArray};

let array = Int32Array::from(vec![1, 2, 3, 4, 5]);
let filter = BooleanArray::from(vec![true, false, true, false, true]);

let filtered = filter::filter(&array, &filter).unwrap();
println!("Filtered array: {:?}", filtered);

高级用法

自定义类型支持

use re_arrow_util::types::ArrowNativeType;
use arrow2::datatypes::DataType;

#[derive(Debug, Clone, Copy)]
struct MyCustomType(i32);

unsafe impl ArrowNativeType for MyCustomType {
    const DATA_TYPE: DataType = DataType::Int32;
    
    fn as_usize(&self) -> usize {
        self.0 as usize
    }
}

let array = arrow2::array::PrimitiveArray::from_vec(vec![
    MyCustomType(1),
    MyCustomType(2),
    MyCustomType(3),
]);

性能优化技巧

  1. 批量操作:尽可能使用批量操作而非单元素操作
  2. 预分配内存:对于已知大小的数据,预分配内存
  3. 重用缓冲区:在循环中重用数组构建器
  4. 零拷贝操作:利用Arrow的零拷贝特性
use re_arrow_util::array::{ArrayBuilder, Int32ArrayBuilder};

// 预分配示例
let mut builder = Int32ArrayBuilder::with_capacity(1000);
for i in 0..1000 {
    builder.append_value(i);
}
let large_array = builder.finish();

完整示例代码

下面是一个完整的示例,展示了如何使用re_arrow_util进行数据处理:

use re_arrow_util::{
    array::{ArrayBuilder, Int32ArrayBuilder},
    cast::cast,
    record_batch::RecordBatch,
    memory,
    filter
};
use arrow2::{
    array::{Int32Array, Utf8Array, BooleanArray},
    datatypes::{DataType, Field, Schema}
};

fn main() {
    // 1. 创建数组
    let mut builder = Int32ArrayBuilder::new();
    builder.append_value(1);
    builder.append_value(2);
    builder.append_null();
    builder.append_value(4);
    let array = builder.finish();
    println!("Created array: {:?}", array);

    // 2. 数据类型转换
    let int_array = Int32Array::from(vec![Some(1), None, Some(3)]);
    let str_array: Utf8Array<i32> = cast(&int_array).unwrap();
    println!("Converted array: {:?}", str_array);

    // 3. 创建记录批
    let schema = Schema::from(vec![
        Field::new("id", DataType::Int32, false),
        Field::new("name", DataType::Utf8, true),
    ]);
    let id_array = Int32Array::from(vec![1, 2, 3]);
    let name_array = Utf8Array::<i32>::from(vec![Some("Alice"), None, Some("Bob")]);
    let batch = RecordBatch::try_new(
        schema,
        vec![Box::new(id_array), Box::new(name_array)],
    ).unwrap();
    println!("Record batch with {} rows", batch.num_rows());

    // 4. 内存使用分析
    let array = Int32Array::from(vec![1, 2, 3, 4, 5]);
    let memory_usage = memory::total_bytes(&array);
    println!("Array memory usage: {} bytes", memory_usage);

    // 5. 数据过滤
    let array = Int32Array::from(vec![1, 2, 3, 4, 5]);
    let filter = BooleanArray::from(vec![true, false, true, false, true]);
    let filtered = filter::filter(&array, &filter).unwrap();
    println!("Filtered array: {:?}", filtered);

    // 6. 性能优化示例
    let mut builder = Int32ArrayBuilder::with_capacity(1000);
    for i in 0..1000 {
        builder.append_value(i);
    }
    let large_array = builder.finish();
    println!("Large array created with {} elements", large_array.len());
}

总结

re_arrow_util提供了高效处理Arrow列式数据的能力,特别适合需要高性能数据处理的Rust应用。通过利用列式内存布局和零拷贝操作,它可以显著提高数据密集型应用的性能。

回到顶部