arrow::open_dataset读取含类数字字符串的Hive分区类型冲突咨询
解决方案
问题根源
当使用open_dataset读取分区目录时,Arrow会自动从目录名(如fieldA=1)推断分区字段的类型,这里被识别为int32;但你的parquet文件中fieldA实际是character类型,导致合并时出现类型冲突报错。
方法一:读取时指定分区字段类型(无需修改现有文件)
使用partitioning参数单独指定分区字段的类型,而非用schema覆盖全量schema。这样既保留数据中所有列的原有schema,又能让Arrow正确识别分区字段的类型,避免冲突:
# 指定分区字段fieldA为字符串类型 ds <- arrow::open_dataset( path = td, partitioning = arrow::schema(fieldA = arrow::string()) ) # 正常读取全部数据 dplyr::collect(ds)
方法二:写入时保留分区列(从源头避免问题)
如果可以重新生成数据集,使用write_dataset时设置keep_partition_columns=TRUE,这样分区字段会保留在parquet文件中,同时目录结构正确,读取时无需额外指定类型就能自动匹配:
# 重新写入数据集,保留分区列fieldA arrow::write_dataset( dat, path = td, partitioning = "fieldA", keep_partition_columns = TRUE ) # 直接读取无类型冲突 arrow::open_dataset(td) |> dplyr::collect()
这两种方法都不需要移除分区变量,也不用定义所有字段的schema,既可以读取单个文件保留分区字段,也能正常合并整个数据集。
内容的提问来源于stack exchange,提问作者r2evans
相关产品推荐
相关产品推荐

