使用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
相关产品推荐
相关产品推荐

