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

Rust Polars读取CSV时,Schema from_iter致Decimal转为f64问题

问题:Schema::from_iter构建时Decimal类型被转为f64?

场景说明

现有如下格式的CSV文件:

2008-03-19 10:15:00,69.00,56.37,59.50,59.50,34803018,34793218,
2008-03-19 10:16:00,64.00,58.05,59.50,59.50,38839940,4024922,

期望以Datetime, Decimal, Decimal, Decimal, Decimal, UInt64, UInt64类型读取该文件。

两种实现方式的结果

  1. 逐个插入字段:代码正常运行,得到的结果类型符合预期:
│ datetime[ms] ┆ decimal[12,4] ┆ decimal[12,4] ┆ decimal[12,4] ┆ decimal[12,4] ┆ u64 ┆ u64│
  1. Schema::from_iter结合Field构建:出现类型错误,Decimal被转为f64:
│ datetime[ms] ┆ f64 ┆ f64 ┆ f64 ┆ f64 ┆ u64 ┆ u64 │

解答

这是使用方式有误,而非Bug。

问题出在Field的构建环节:如果使用Schema::from_iter时,没有明确为Decimal类型字段指定精度(precision)和刻度(scale),或者Field的类型参数未显式设置为Decimal类型,底层框架会默认将数值类型推断为f64。

正确的做法是在构建Field时,明确指定Decimal的精度和刻度,示例代码如下:

let schema = Schema::from_iter([
    Field::new("datetime", DataType::Datetime(TimeUnit::Millisecond, None), false),
    Field::new("col1", DataType::Decimal(12, 4), false),
    Field::new("col2", DataType::Decimal(12, 4), false),
    Field::new("col3", DataType::Decimal(12, 4), false),
    Field::new("col4", DataType::Decimal(12, 4), false),
    Field::new("col5", DataType::UInt64, false),
    Field::new("col6", DataType::UInt64, false),
]);

确保每个Decimal字段都显式指定DataType::Decimal(precision, scale),而非依赖默认推断,即可得到正确的Schema类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:22:22