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类型读取该文件。
两种实现方式的结果
- 逐个插入字段:代码正常运行,得到的结果类型符合预期:
│ datetime[ms] ┆ decimal[12,4] ┆ decimal[12,4] ┆ decimal[12,4] ┆ decimal[12,4] ┆ u64 ┆ u64│
- 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
相关产品推荐
相关产品推荐

