⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 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 倍。