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

DuckDB转换JSONL为Parquet时如何避免写入Hive分区字段?

解决DuckDB将Hive分区值写入Parquet的问题

DuckDB的read_json_auto默认会自动识别Hive风格的分区目录,把user_id、report_date这类分区键作为额外字段加入查询结果,最终写入Parquet文件。如果不需要这些字段,可通过以下两种方式解决:

方法1:关闭Hive分区自动检测

在read_json_auto参数中添加hive_partitioning=false,阻止DuckDB从目录路径提取分区字段:

jsonl_file_path ='/users/user_id=123/report_date=2024-04-30/data.jsonl'
out_path = '/users/user_id=123/report_date=2024-04-30/data.parquet'

db.sql(
    f"""
    COPY (
        SELECT * FROM read_json_auto(
            '{jsonl_file_path}',
            maximum_depth=-1,
            sample_size=-1,
            ignore_errors=true,
            hive_partitioning=false  -- 禁用Hive分区自动检测
        )
    )
    TO '{out_path}' (
        FORMAT PARQUET,
        ROW_GROUP_SIZE 100000,
        OVERWRITE_OR_IGNORE 1
    );
    """
)

方法2:显式排除分区字段

如果需要保留分区检测逻辑但不想将分区字段写入Parquet,可在SELECT语句中用EXCLUDE语法排除指定字段:

jsonl_file_path ='/users/user_id=123/report_date=2024-04-30/data.jsonl'
out_path = '/users/user_id=123/report_date=2024-04-30/data.parquet'

db.sql(
    f"""
    COPY (
        SELECT * EXCLUDE (user_id, report_date) FROM read_json_auto(
            '{jsonl_file_path}',
            maximum_depth=-1,
            sample_size=-1,
            ignore_errors=true
        )
    )
    TO '{out_path}' (
        FORMAT PARQUET,
        ROW_GROUP_SIZE 100000,
        OVERWRITE_OR_IGNORE 1
    );
    """
)
  • 方法1适合完全不需要分区字段的场景,操作更直接;
  • 方法2适合需要在查询过程中使用分区字段,但最终输出Parquet时不需要保留的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:07:13