我是PySpark环境的新手,在尝试使用加密模块加密RDD中的数据时遇到了错误。这是代码:
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('encrypt').getOrCreate()
df = spark.read.csv('test.csv', inferSchema = True, header = True)
df.show()
df.printSchema()
from cryptography.fernet import Fernet
key = Fernet.generate_key()
f = Fernet(key)
dfRDD = df.rdd
print(dfRDD)
mappedRDD = dfRDD.map(lambda value: (value[0], str(f.encrypt(str.encode(value[1]))), value[2] * 100))
data = mappedRDD.toDF()
data.show()
当我尝试将value[1]
映射到str(f.encrypt(str.encode(value[1])))
之前,一切正常。我收到以下错误:
PicklingError:无法序列化对象:TypeError:无法修改CompiledFFI对象
我没有看到太多资源引用此错误,并希望看到是否有其他人遇到过它(或者如果通过PySpark你有一种推荐的列加密方法)。
答案 0 :(得分:2)
建议的列加密方法
您可以考虑使用Hive内置加密(HIVE-5207,HIVE-6329),但目前这一点非常有限(HIVE-7934)。
您当前的代码不起作用,因为Fernet
对象不可序列化。您可以通过仅分发密钥来使其工作:
def f(value, key=key):
return value[0], str(Fernet(key).encrypt(str.encode(value[1]))), value[2] * 100
mappedRDD = dfRDD.map(f)
或
def g(values, key=key):
f = Fernet(key)
for value in values:
yield value[0], str(f.encrypt(str.encode(value[1]))), value[2] * 100
mappedRDD = dfRDD.mapPartitions(g)