使用DuckDB导出Parquet时列名异常修改的问题咨询
DuckDB导出Parquet列名异常排查(Node.js环境)
现象回顾
在Ubuntu 23.04系统中,通过Node.js操作DuckDB内存实例,创建含_id、str、num列的表并插入数据后:
- 导出为CSV文件时列名完全正常;
- 导出为Parquet文件时,用parquet-tools查看发现:非下划线开头的列首字母被大写(如
str→Str),下划线开头的列被添加PARGO_PREFIX_前缀(如_id→PARGO_PREFIX__id)。
排查方向及解决方法
检查DuckDB Parquet导出默认配置
DuckDB默认开启了两个Parquet导出参数:parquet_uppercase_names和parquet_prefix_underscore_names,这正是导致列名被篡改的原因——前者将列名首字母转为大写,后者给下划线开头的列添加指定前缀,而CSV导出不受这两个参数影响。
解决方式:导出前显式关闭这两个配置,示例SQL:SET parquet_uppercase_names = false; SET parquet_prefix_underscore_names = false; COPY your_table_name TO 'output.parquet' (FORMAT PARQUET);确认Node.js端DuckDB版本兼容性
部分旧版本的DuckDB Node.js绑定可能存在配置参数默认值异常或bug,建议将@duckdb/duckdb-node包更新到最新稳定版,再重新测试导出逻辑。显式指定导出参数
避免依赖默认配置,在COPY语句中直接指定参数,确保列名保留原始格式:const db = new duckdb.Database(':memory:'); // 创建表、插入数据逻辑... db.run(`COPY your_table TO 'output.parquet' (FORMAT PARQUET, parquet_uppercase_names false, parquet_prefix_underscore_names false);`);验证parquet-tools的准确性
偶尔parquet-tools的解析展示可能存在偏差,可以用DuckDB直接读取导出的Parquet文件,执行SELECT * FROM 'output.parquet';查看列名是否正常,排除工具本身的显示问题。
内容的提问来源于stack exchange,提问作者Jeff Breadner
相关产品推荐
相关产品推荐

