首页 > 解决方案 > 如何加密 JSON 字段,然后将该字段读回 JSON

问题描述

我能够从包含 JSON 对象的列中检索要加密的字段,一旦我加密了该字段,我想将其读回 JSON。这就是我的数据框的外观:

json: struct
 id:string
 pii:string
 type:string
 dataContentType:string
 dataSchema:string
 time:string
enqueuedTime:date

两列(JSON,EnqueuedTime),所以我希望能够获取 pii 值并对其进行加密,然后将其读回 JSON 列。我们有一个当前的解决方案,将 JSON 扁平化为单独的列,但客户端希望保留原始 JSON 结构。我正在努力寻找一种将加密值读回 JSON 或通过 PySpark 反转 JSON 扁平化的方法。

标签: pysparkapache-spark-sqldatabricks

解决方案


这个最小的独立示例向您展示了如何使用 和自定义 udf 函数加密您的字段piiwithColumnwithField

import pyspark.sql.functions as F
import pyspark.sql.types as T

structureSchema = T.StructType([
          T.StructField('json', T.StructType([
             T.StructField('id', T.StringType(), True),
             T.StructField('pii', T.StringType(), True),
             ])),
         ])

df = spark.createDataFrame([(("123", "some json"),), (("456", "some more json"),)], structureSchema)
df.show()

@udf(returnType=T.StringType()) 
def encrypt_json(s):
  return "Enc: " + s

df_result = df.withColumn("json", F.col("json").withField("pii", encrypt_json(F.col("json.pii"))))
df_result.show()

输出:

+--------------------+
|                json|
+--------------------+
|    {123, some json}|
|{456, some more j...|
+--------------------+

+--------------------+
|                json|
+--------------------+
|{123, Enc: some j...|
|{456, Enc: some m...|
+--------------------+

你当然需要encrypt_json用你自己的加密函数替换 udf 函数。


推荐阅读