跳到主要内容

Parquet 加密

从 0.10.0 版本开始,Goose 支持读取与写入加密的 Parquet 文件。 Goose 大体遵循 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'});

限制

Goose 当前的 Parquet 加密存在以下限制:

  1. It is not compatible with the encryption of, e.g., PyArrow, until the missing details are implemented.

  2. Goose 会使用 footer_key 加密 footer 与所有列。Parquet 规范允许不同列使用不同密钥,例如:

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

    但 Goose 目前尚不支持该能力,会报错(当前行为):

    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 倍。