DuckDB 将 hive 分区插入 parquet 文件中

问题描述 投票:0回答:1

我有由

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
,但问题仍然存在,有人知道如何解决这个问题吗?

python hive parquet duckdb
1个回答
0
投票

如果我理解正确的话,你想要进行分区写入,需要使用

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
        );
        """
    )
© www.soinside.com 2019 - 2024. All rights reserved.