【问题标题】:Spark returning Pickle error: cannot lookup attributeSpark 返回 Pickle 错误:无法查找属性
【发布时间】:2015-02-17 19:18:07
【问题描述】:

尝试在我的 RDD 中启动一个类时,我遇到了一些属性查找问题。

我的工作流程:

1- 从 RDD 开始

2- 取RDD的每个元素,为每个元素初始化一个对象

3-Reduce(我会写一个方法来定义reduce操作)

这里是#2:

>class test(object):
def __init__(self, a,b):
    self.total = a + b

>a = sc.parallelize([(True,False),(False,False)])
>a.map(lambda (x,y): test(x,y))

这是我得到的错误:

PicklingError: Can't pickle ma​​in.test' >: 属性查找 ma​​in.test 失败

我想知道是否有任何解决方法。请回答一个工作示例以实现预期结果(即创建类“测试”对象的 RDD)。

相关问题:

【问题讨论】:

    标签: python apache-spark pickle


    【解决方案1】:

    来自 Davies Liu(DataBricks):

    "目前PySpark不支持pickle当前类对象 脚本('ma​​in'),解决方法可以是实现 的类到一个单独的模块,然后使用“bin/spark-submit --py-files xxx.py" 在部署中。

    在 xxx.py 中:

    class test(object):
         def __init__(self, a, b):
            self.total = a + b
    

    在job.py中:

    from xxx import test
    a = sc.parallelize([(True,False),(False,False)])
    a.map(lambda (x,y): test(x,y))
    

    运行它:

    bin/spark-submit --py-files xxx.py job.py
    

    "

    只想指出,您也可以在 Spark Shell 中传递相同的参数(--py-files)。

    【讨论】:

    • 如果'spark` 将cloudpickle 换成dill,你可以这样做。 spark-project.atlassian.net/browse/SPARK-791
    • 在阅读“pickle 将序列化几乎所有 Python 对象”然后收到此错误后,我已经很惊讶了。
    • 如何在 spark shell 中传递相同的参数?
    • 听起来pyspark不太成熟
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 2018-07-11
    • 2013-03-18
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多