我有由
user_id
和 report_date
分区的 jsonl 文件。我将这些 jsonl 文件转换为 parquet 文件,并使用 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
)
)
TO '{out_path}' (
FORMAT PARQUET,
ROW_GROUP_SIZE 100000,
OVERWRITE_OR_IGNORE 1
);
"""
)
它工作正常,但问题是 DuckDB 正在将 hive 分区值插入 parquet 文件中,即 user_id 和 report_date,这些值不在 jsonl 文件中。我尝试添加
hive_partitioning = false
,但问题仍然存在,有人知道如何解决这个问题吗?
如果我理解正确的话,你想要进行分区写入,需要使用
PARTITION_BY
。
进行分区写入时,不应将 hive 分区作为输出路径的一部分。分区写入将为每个分区有许多文件的情况构建这些路径和文件名。您可以使用
FILENAME_PATTERN
来模板化文件格式。
jsonl_file_path ='/users/user_id=123/report_date=2024-04-30/data.jsonl'
out_path = '/users'
file_pattern = 'data_{i}'
db.sql(
f"""
COPY (
SELECT * FROM read_json_auto(
'{jsonl_file_path}',
maximum_depth=-1,
sample_size=-1,
ignore_errors=true
)
)
TO '{out_path}' (
FORMAT PARQUET,
PARTITION_BY (user_id, report_date),
FILENAME_PATTERN {file_pattern}
ROW_GROUP_SIZE 100000,
OVERWRITE_OR_IGNORE 1
);
"""
)