从版本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');
写入加密的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'});
Limitations
DuckDB的Parquet加密目前有以下限制。
-
在实现缺失的细节之前,它与例如PyArrow的加密不兼容。
-
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
性能影响
请注意,加密会对性能产生一些影响。
在没有加密的情况下,从/到Parquet文件读取/写入TPC-H
的lineitem
表(SF1,600万行和15列)分别需要0.26秒和0.99秒。
使用加密后,这需要0.64秒和2.21秒,两者都比未加密版本慢约2.5倍。