如何在Arrow中按原变量类型创建匹配CSV列顺序的Schema?
修复Arrow包中Schema字段顺序不匹配的问题
你的问题出在my_schema_2的创建逻辑上:代码把所有数值型字段放在前面,字符型字段放在后面,完全打乱了sample.csv的原始列顺序,而Arrow读取CSV时要求Schema的字段顺序必须和数据源的列顺序一致,因此导致读取失败。
修复方案
保持原数据lakers的列顺序,逐个判断每个字段的类型并生成对应的Field,不要分组拼接数值型和字符型字段。
修改后的完整代码:
library(tidyverse) library(arrow) library(lubridate) data(lakers) # 创建sample.csv文件 write.csv(lakers,"sample.csv",row.names = FALSE) # 修复后的my_schema_2:按原列顺序生成Schema my_schema_2 <- schema( purrr::map(names(lakers), ~ { # 针对每个字段判断类型:数值型用double,字符型用string col_type <- if (is.numeric(lakers[[.x]])) double() else string() Field$create(name = .x, type = col_type) }) ) arrow_data_2 <- arrow::open_csv_dataset('sample.csv', schema = my_schema_2, skip = 1) arrow_data_2 %>% as.data.frame()
关键说明
- 按
names(lakers)的顺序遍历字段,确保Schema的字段顺序和sample.csv的列顺序完全一致 - 对每个字段单独判断类型,避免分组操作打乱原始顺序
- 这样Arrow在解析CSV时,能准确将每一列映射到Schema对应的字段类型,解决读取失败的问题
内容的提问来源于stack exchange,提问作者anderwyang
相关产品推荐
相关产品推荐

