如何创建PyArrow Parquet加密属性以加密Pandas DataFrame?
解决PyArrow Parquet加密属性创建问题
要创建encryption_properties,你需要使用PyArrow Parquet模块提供的加密相关类,核心是EncryptionProperties,配合密钥材料提供者和加密算法实现。以下是完整的可运行代码示例:
步骤1:导入加密相关模块
除基础的pandas和pyarrow外,还需导入Parquet加密的专用类:
import pandas as pd import pyarrow as pa import pyarrow.parquet as pq from pyarrow.parquet import ( EncryptionProperties, AesGcmV1Encryption, LocalKeyMaterialProvider ) import secrets
步骤2:生成加密密钥
AES-GCM加密要求密钥长度为16、24或32字节(对应128、192、256位加密),用secrets模块生成安全随机密钥:
# 生成256位(32字节)的AES密钥 encryption_key = secrets.token_bytes(32) # 为密钥指定唯一ID(解密时需匹配) key_id = b"my-secret-key-id"
步骤3:创建密钥材料提供者
使用LocalKeyMaterialProvider关联密钥与ID:
key_provider = LocalKeyMaterialProvider() key_provider.add_key(key_id, encryption_key)
步骤4:构建加密属性
支持两种加密模式,按需选择:
选项A:文件级全加密
加密整个Parquet文件:
# 指定加密算法为AES-GCM v1 encryption_algorithm = AesGcmV1Encryption() # 创建加密属性 enc_prop = EncryptionProperties( encryption_algorithm=encryption_algorithm, key_material_provider=key_provider, encryption_key_id=key_id )
选项B:列级加密(仅加密指定列)
仅对特定列加密,比如示例中的col2:
enc_prop = EncryptionProperties( encryption_algorithm=AesGcmV1Encryption(), key_material_provider=key_provider, encryption_key_id=key_id, encrypted_columns=["col2"] # 指定需要加密的列名 )
步骤5:加密保存Parquet文件
将DataFrame转为PyArrow Table后,传入加密属性写入:
# 创建示例DataFrame d = {'col1': [1, 2], 'col2': [3, 4]} df = pd.DataFrame(data=d) # 转为PyArrow Table table = pa.Table.from_pandas(df) # 加密写入Parquet pq.write_table(table, "test_encrypted.parquet", encryption_properties=enc_prop)
额外注意事项
- 解密时需使用相同的密钥ID、密钥及对应密钥提供者配置。
- 密钥需妥善保管,丢失密钥会导致数据无法恢复。
- 确保PyArrow版本在6.0.0及以上(该版本开始支持Parquet加密功能)。
内容的提问来源于stack exchange,提问作者seb2704
相关产品推荐
相关产品推荐

