如何让DuckDB导出Hive分区Parquet时不写入分区列?
如何让DuckDB导出Hive分区Parquet时不将分区列写入文件内?
我尝试用Hive分区将DuckDB表导出为Parquet文件,但DuckDB会同时把分区列写入Hive分区路径和Parquet文件中,这不符合预期,而且多数工具会因为检测到重复列(文件内和Hive分区各一次)无法读取该文件。有没有办法让DuckDB避免把分区列写入Parquet文件?
复现步骤
- 创建测试表:
CREATE TABLE t ( id BIGINT, other_col VARCHAR, part VARCHAR ); INSERT INTO t VALUES (1, '1', 'part1'), (2, '2', 'part2');
- 执行导出命令:
COPY t TO 'table_partitioned' (FORMAT PARQUET, PARTITION_BY part);
- 生成的输出路径:
table_partitioned/part=part1/data_0.parquet - 导出文件的schema:
message duckdb_schema { OPTIONAL INT64 id (INT_64); OPTIONAL BYTE_ARRAY other_col (UTF8); OPTIONAL BYTE_ARRAY part (UTF8); }
解决方案
可以通过显式指定导出列、排除分区列的方式解决这个问题,这样Parquet文件内不会存储分区列,但Hive分区的路径结构会正常保留。
有两种写法:
- 使用子查询筛选列:
COPY (SELECT id, other_col FROM t) TO 'table_partitioned' (FORMAT PARQUET, PARTITION_BY part);
- 直接在COPY语句中指定列列表:
COPY t (id, other_col) TO 'table_partitioned' (FORMAT PARQUET, PARTITION_BY part);
执行修改后的命令后,导出的Parquet文件schema会变为:
message duckdb_schema { OPTIONAL INT64 id (INT_64); OPTIONAL BYTE_ARRAY other_col (UTF8); }
此时其他工具读取该Hive分区的Parquet文件时,就不会遇到重复列的问题了。
内容的提问来源于stack exchange,提问作者Erica
相关产品推荐
相关产品推荐

