You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:35:41