Parquet加密:如何加密结构体数组类型列?
Spark 3.2+ Parquet列级加密:嵌套结构(数组/结构体)的支持与配置方法
Spark 3.2及以上版本的Parquet列级加密完全支持嵌套结构体、数组类型的列或其子列加密,只是官方文档未针对嵌套场景做明确说明,以下是具体配置与使用方法:
1. 加密整个嵌套列(结构体/数组顶层列)
和普通列的配置逻辑一致,直接用嵌套列的顶层名称指定加密密钥即可。
比如要加密示例中的more列(数组嵌套结构体类型),配置如下:
spark.sql.parquet.columnEncryption.keys=more:keyB
2. 加密嵌套子列(结构体中的字段)
针对嵌套结构体的子字段,使用点分隔的完整列路径来指定密钥。
例如要加密more.name子列,配置为:
spark.sql.parquet.columnEncryption.keys=more.name:keyC
如果是数组元素内的结构体子字段,同样用点路径指定,比如数组列users中的users.age子字段:
spark.sql.parquet.columnEncryption.keys=users.age:keyD
完整代码示例
以下是包含普通列、整个嵌套列、嵌套子列加密的Scala实操示例:
// 构造带嵌套结构的测试DataFrame val testDF = spark.createDataFrame(Seq( (1, 1, Array(("Alice", 25), ("Bob", 30))), (2, 4, Array(("Charlie", 35), ("David", 40))) )).toDF("id", "square", "more") // 启用Parquet列级加密并配置密钥 spark.conf.set("spark.sql.parquet.columnEncryption.enabled", "true") // 配置:square列用keyA加密,整个more列用keyB,more中的name子列用keyC spark.conf.set("spark.sql.parquet.columnEncryption.keys", "square:keyA,more:keyB,more.name:keyC") // 配置密钥提供者(根据环境选择,如本地测试用的测试提供者或生产KMS) spark.conf.set("spark.sql.parquet.columnEncryption.keyProvider", "org.apache.spark.sql.parquet.testing.TestingParquetCryptoKeyProvider") // 写入加密后的Parquet文件 testDF.write.mode("overwrite").parquet("/tmp/encrypted_nested_parquet")
关键注意事项
- 密钥管理:需确保配置的密钥提供者能正确获取对应密钥,本地测试与生产KMS环境的密钥提供者配置不同,需结合实际场景调整。
- 解密验证:读取加密文件时,必须持有对应密钥才能解密查看目标列;若缺少密钥,对应列会返回解密错误或无法读取。
- 数组子字段加密:数组类型的子字段加密无需特殊处理,用完整点路径指定即可。
内容的提问来源于stack exchange,提问作者btbbass
相关产品推荐
相关产品推荐

