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

使用R中DuckDB将CSV转Parquet时的列类型问题

解决DuckDB CSV转Parquet时列类型强制指定问题

问题核心是读取CSV阶段的自动类型检测出错:read_csv_auto将包含混合值的code列误判为BIGINT,后续导出Parquet时遇到带字符的code值(如"FELH234713")触发转换失败。你需要在读取CSV时就显式指定code的类型为VARCHAR,而非在导出阶段尝试修改。

正确代码示例

# 创建视图时显式指定code列类型为VARCHAR
dbExecute(con, sprintf("CREATE VIEW csv_data AS SELECT * FROM read_csv_auto('%s', types={'code': 'VARCHAR'})", csv_file))

# 执行Parquet导出(此时code列已为VARCHAR类型,不会报错)
dbExecute(con, sprintf("COPY (SELECT * FROM csv_data) TO '%s' (FORMAT 'parquet', CODEC 'snappy')", parquet_file))

为什么之前的尝试无效

你在COPY语句中添加TYPES参数的思路错误:COPY的TYPES参数仅用于读取无格式数据源时指定类型,写入Parquet时会直接沿用查询结果的列类型。因此必须在读取CSV的源头修正类型。

额外说明

针对500GB的大文件,DuckDB采用流式处理,不会将整个文件加载到内存,上述方法完全适用。如果还有其他列需要指定类型,可在types参数中添加更多键值对,比如types={'code': 'VARCHAR', 'other_col': 'DATE'}。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:02:38