⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
Parquet 加密

从 0.10.0 版本开始,DuckDB 支持读取和写入加密的 Parquet 文件。DuckDB 大体上遵循 Parquet 模块化加密规范,但存在一些限制

读取和写入加密文件

使用 PRAGMA add_parquet_key 函数,可以将 128、192 或 256 位的命名加密密钥添加到会话中。这些密钥存储在内存中。

PRAGMA add_parquet_key('key128', '0123456789112345');
PRAGMA add_parquet_key('key192', '012345678911234501234567');
PRAGMA add_parquet_key('key256', '01234567891123450123456789112345');
PRAGMA add_parquet_key('key256base64', 'MDEyMzQ1Njc4OTExMjM0NTAxMjM0NTY3ODkxMTIzNDU=');

写入加密的 Parquet 文件

在指定密钥(例如 key256)后,文件可以按如下方式进行加密:

COPY tbl TO 'tbl.parquet' (ENCRYPTION_CONFIG {footer_key: 'key256'});

读取加密的 Parquet 文件

使用特定密钥(例如 key256)加密的 Parquet 文件,可以按如下方式读取:

COPY tbl FROM 'tbl.parquet' (ENCRYPTION_CONFIG {footer_key: 'key256'});

SELECT *
FROM read_parquet('tbl.parquet', encryption_config = {footer_key: 'key256'});

限制

DuckDB 的 Parquet 加密目前存在以下限制。

  1. 在实现缺失的细节之前,它与例如 PyArrow 的加密不兼容。

  2. DuckDB 使用 footer_key 加密页脚和所有列。Parquet 规范允许使用不同的密钥加密各个列,例如:

    COPY tbl TO 'tbl.parquet'
        (ENCRYPTION_CONFIG {
            footer_key: 'key256',
            column_keys: {key256: ['col0', 'col1']}
        });
    

    然而,目前尚不支持此功能,且(暂时)会抛出错误。

    Not implemented Error: Parquet encryption_config column_keys not yet implemented
    

性能影响

请注意,加密会对性能产生一定影响。在未加密的情况下,从 TPC-H SF1 读取/写入 lineitem 表(包含 600 万行和 15 列)至 Parquet 文件分别需要 0.26 秒和 0.99 秒。在加密的情况下,这需要 0.64 秒和 2.21 秒,两者都比未加密版本慢大约 2.5 倍。

© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南