Skip to content

parquet

duckdb 提供了对 parquet 的完整读写支持。

读取

SQL
-- 读取单个 parquet 文件
SELECT * FROM 'test.parquet';
-- 查看 Parquet 中具有那些列以及他们的数据类型
DESCRIBE SELECT * FROM 'test.parquet';

-- 读取多个文件
SELECT * FROM 'test/*.parquet'

read_parquet()

上面的读取实际上都是调用了该方法实现的,前提是他们必须以 .parquet 结尾,而且是合法的 parquet 文件。当然该函数还提供了一些其他参数来处理一些特殊行为:

Python
def read_parquet(
    path: str|list[str],   # parquet 文件路径,或文件路径列表
    filename:bool = False, # 结果列中包含额外的 filename 列
    union_by_name:bool = False, # 如果两个 parquet 文件的 schema 不同而想要合并该参数决定了是否以字段名来合并
):
    pass

其中必须使用该方法的包括:

SQL
-- 特定多文件
SELECT * FROM read_parquet(['file1.parquet', 'file2.parquet', 'file3.parquet']);
-- 多文件夹
SELECT * FROM read_parquet(['folder1/*.parquet', 'folder2/*.parquet']);

-- 非 parquet 结尾
SELECT * FROM read_parquet('test.parq');

-- 指定参数
SELECT * FROM read_parquet('test/*.parquet', filename = true);

投影/谓词下推

DockDB 支持将投影和谓词下推到 Parquet 文件本身,也就是说在查询 Parquet 文件时,只需要查询特定的列以及过滤特定的行。

写入

写入 Parquet 文件主要通过 COPY 语句来提供支持:

SQL
COPY
    (SELECT * FROM tbl)
    TO 'result-snappy.parquet'
    (FORMAT 'parquet');

-- 还可以设置特定的压缩算法和行组大小
COPY
    (FROM generate_series(100_000))
    TO 'test.parquet'
    (FORMAT 'parquet', COMPRESSION 'zstd', ROW_GROUP_SIZE 100_000);

读取元数据

duckdb 提供了几种方法来读取 parquet 的元数据:

SQL
-- 读取 parquet 文件的元数据
SELECT *
FROM parquet_metadata('test.parquet');

-- 特定文件的元数据
SELECT *
FROM parquet_file_metadata('test.parquet');

-- 键值对元数据
SELECT *
FROM parquet_kv_metadata('test.parquet');


-- 文件架构
SELECT *
FROM parquet_schema('test.parquet');