You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从外部原始值创建Polars-Arrow的Utf8Array?

Polars-Arrow 从原始值创建Utf8Array的实现方法

给定以下原始数据,需要生成等效于[Some("hello"), None, Some("world")]的Polars-Arrow LargeUtf8Array:

let offsets: &[i64] = [0, 5, 5, 10, 0, 0, 0, 0];
// 对应字符串"helloworld"
let values: &[u8] = [104, 101, 108, 108, 111, 119, 111, 114, 108, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
// 对应序列["hello", null, "world"]的null位图
let null_bitmap: &[u8] = [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

实现代码

Polars-Arrow 基于 arrow-rs 构建,因此实现方式与你熟悉的 arrow-rs 逻辑高度一致,仅需适配 Polars-Arrow 的类型封装:

use polars_arrow::array::LargeUtf8Array;
use polars_arrow::bitmap::Bitmap;
use polars_arrow::buffer::Buffer;
use polars_arrow::datatypes::DataType;
use polars_arrow::array::ArrayData;

fn main() {
    let offsets: &[i64] = [0, 5, 5, 10, 0, 0, 0, 0];
    let values: &[u8] = [104, 101, 108, 108, 111, 119, 111, 114, 108, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
    let null_bitmap: &[u8] = [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

    // 将原始切片转换为Polars-Arrow的Buffer类型
    let offsets_buffer = Buffer::from_slice_ref(offsets);
    let values_buffer = Buffer::from_slice_ref(values);
    // 转换null位图:需指定有效长度为数组元素个数(3),避免解析无效位
    let bitmap = Bitmap::from_slice(null_bitmap, 3);

    // 通过ArrayData构造器创建数组数据
    let array_data = ArrayData::builder(DataType::LargeUtf8)
        .len(3)
        .null_count(1)
        .add_buffer(offsets_buffer)
        .add_buffer(values_buffer)
        .null_bit_buffer(Some(bitmap.into()))
        .build()
        .unwrap();

    // 转换为LargeUtf8Array
    let utf8_array = LargeUtf8Array::from(array_data);

    // 验证结果
    assert_eq!(utf8_array.get(0), Some("hello"));
    assert_eq!(utf8_array.get(1), None);
    assert_eq!(utf8_array.get(2), Some("world"));
}

关键说明

  • Polars-Arrow 复用了 arrow-rs 的核心类型(如Buffer、ArrayData),因此逻辑与你熟悉的 arrow-rs 实现几乎一致。
  • 转换 null 位图时必须指定有效长度(这里是3),因为原始切片包含大量无效的空字节,直接使用会导致错误的null标记。

内容的提问来源于stack exchange,提问作者Cory Grinstead

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 10:15:56