如何从Parquet文件的list[i16]类型列提取Vec<i16>
解决方案
要将Parquet文件中list[i16]类型列的第一行转换为Rust原生Vec<i16>,核心是把动态类型的Box<dyn Array>向下转换为具体的Int16Array,再提取元素。以下是完整实现代码:
use std::fs::File; use polars::prelude::*; use arrow::array::{Int16Array, ListArray}; use std::any::Any; fn main() { let mut file = File::open("/path/to/file.parquet").unwrap(); let df = ParquetReader::new(&mut file).finish().unwrap(); let column = df.column("Column A").unwrap(); // 将Series转换为ListArray let list_array = column.list().unwrap(); // 获取第一行对应的嵌套数组 let first_list = list_array.get(0).unwrap(); // 向下转型为具体的Int16Array let int16_array = first_list.as_any().downcast_ref::<Int16Array>().unwrap(); // 收集数组元素为Vec<i16> let vec: Vec<i16> = int16_array.iter().flatten().collect(); println!("{:?}", vec); }
关键步骤说明
column.list().unwrap():将Series转换为ListArray,适配list[i16]的列类型。list_array.get(0).unwrap():提取第一行对应的嵌套数组,返回的Box<dyn Array>本质是Int16Array实例。as_any().downcast_ref::<Int16Array>():借助Anytrait完成动态类型到具体类型的转换,需确保类型匹配,否则返回None。iter().flatten().collect():遍历数组元素(元素为Option<i16>),过滤空值后收集为原生Vec<i16>。
安全优化提示
实际项目中建议替换unwrap()为健壮的错误处理逻辑,避免panic:
match column.list() { Ok(list_array) => { match list_array.get(0) { Some(first_list) => { if let Some(int16_array) = first_list.as_any().downcast_ref::<Int16Array>() { let vec: Vec<i16> = int16_array.iter().flatten().collect(); // 处理转换后的向量 } else { eprintln!("数组类型转换失败"); } } None => eprintln!("第一行数据不存在"), } } Err(e) => eprintln!("获取ListArray失败: {}", e), }
内容的提问来源于stack exchange,提问作者PeterPawn
相关产品推荐
相关产品推荐

