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

如何从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>():借助Any trait完成动态类型到具体类型的转换,需确保类型匹配,否则返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:54:52