PySpark:PicklingError:无法序列化对象:TypeError:无法pickle CompiledFFI对象

2024-05-29 02:14:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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: Could not serialize object: TypeError: can't pickle CompiledFFI objects

我没有看到太多的参考资料提到这个错误,我想看看是否有其他人遇到过这个错误(或者如果通过PySpark,您有一个列加密的推荐方法)。


Tags: csvkeyfromimporttruedfvalue错误
1条回答
网友
1楼 · 发布于 2024-05-29 02:14:41

recommended approach to column encryption

您可以考虑配置单元内置加密(HIVE-5207HIVE-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)

相关问题 更多 >

    热门问题