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

