如何从外部原始值创建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
相关产品推荐
相关产品推荐

