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 加密存在以下限制:
-
It is not compatible with the encryption of, e.g., PyArrow, until the missing details are implemented.
-
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 倍。