【问题标题】:PySpark: PicklingError: Could not serialize object: TypeError: can't pickle CompiledFFI objectsPySpark:PicklingError:无法序列化对象:TypeError:无法腌制CompiledFFI对象
【发布时间】:2017-08-21 04:31:48
【问题描述】:

我是 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,你有推荐的列加密方法)。

【问题讨论】:

  • 我想补充一点,我正在使用 2017 年更新的 Mac、Jupyter Notebook 和通过 Homebrew 下载的本地 PySpark...

标签: python apache-spark pyspark pickle


【解决方案1】:

推荐的列加密方法

您可以考虑 Hive 内置加密(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)

【讨论】:

    猜你喜欢
    • 2019-03-12
    • 2018-09-18
    • 2018-04-25
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多