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

如何让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分区的路径结构会正常保留。

有两种写法:

  1. 使用子查询筛选列:
COPY (SELECT id, other_col FROM t)
TO 'table_partitioned'
(FORMAT PARQUET, PARTITION_BY part);
  1. 直接在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 23:34:56