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

在R中使用Arrow读取CSV时将解析失败值设为NA的方法

解决Arrow包读取CSV时解析失败值自动设为NA的问题

我需要用R的arrow包open_dataset函数读取一个约1800万行、1000列的CSV文件,且预先指定schema。但该CSV生成时存在错误,部分值不符合预设schema(例如age列应为int类型,却出现了字符串类型的姓名)。我希望将这些无法解析为整数的age值设为NA,而不是让程序抛出「CSV conversion error to int8: invalid value」的错误。目前我知道可通过CsvConvertOptions$create指定null_values来处理,但需要预先知晓错误值,这需要两次遍历数据,效率较低。请问是否有无需预先知晓错误值即可将解析失败值设为NA的方法?

示例报错代码

library(tidyverse)
library(arrow)

# 生成测试CSV
tibble(age = c(1,2,"StackOverflow",5)) %>%
  write_csv("example.csv")

# 读取时报错的代码
arrow::open_dataset("example.csv", format = "csv", schema = schema(age = int8()), skip = 1) %>% 
  collect()

已知的低效处理方式

arrow::open_dataset("example.csv",  format = "csv", schema = schema(age = int8()), skip = 1,
     convert_options = CsvConvertOptions$create(null_values = "StackOverflow")) %>% 
     collect()

高效解决方案

你可以通过设置CsvConvertOptions的invalid_field_behavior参数为"null",无需提前知晓错误值,就能自动将所有解析失败的字段值转为NA,同时避免程序报错。

优化后的代码

library(tidyverse)
library(arrow)

# 读取CSV,自动将解析失败值转为NA
arrow::open_dataset(
  "example.csv", 
  format = "csv", 
  schema = schema(age = int8()), 
  skip = 1,
  convert_options = CsvConvertOptions$create(invalid_field_behavior = "null")
) %>% 
  collect()

说明

这个参数会让Arrow在遇到无法转换为指定类型的值时,自动将其替换为对应类型的空值(比如int类型对应NA_integer_)。无需提前遍历数据收集错误值,一次读取即可完成处理,效率更高,非常适合大规模数据集的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:03:30