Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySpark:在RDD中使用对象_Python_Apache Spark_Pyspark - Fatal编程技术网

Python PySpark:在RDD中使用对象

Python PySpark:在RDD中使用对象,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我目前正在学习Python,并希望将其应用于Spark。 我有一个非常简单(而且无用)的脚本: 在执行时使用 spark提交CustomClass.py ..以下错误为thorwn(输出缩短): 给我一份声明 PicklingError:无法pickle\uuuu main\uuuu.MyClass:属性查找\uuuuu main\uuuu.MyClass失败 这似乎很重要。这意味着类实例不能被序列化,对吗? 你知道如何解决这个问题吗 感谢和问候有许多问题: 如果将MyClass放在单独的文件

我目前正在学习Python,并希望将其应用于Spark。 我有一个非常简单(而且无用)的脚本:

在执行时使用

spark提交CustomClass.py

..以下错误为thorwn(输出缩短):

给我一份声明

PicklingError:无法pickle\uuuu main\uuuu.MyClass:属性查找\uuuuu main\uuuu.MyClass失败

这似乎很重要。这意味着类实例不能被序列化,对吗? 你知道如何解决这个问题吗


感谢和问候

有许多问题:

  • 如果将
    MyClass
    放在单独的文件中,则可以对其进行pickle处理。这是许多Python使用pickle的常见问题。通过移动
    MyClass
    和使用MyClass中的
    导入MyClass
    可以简单地解决这个问题。通常,
    dill
    可以解决这些问题(如
    将dill导入pickle
    ),但在这里它对我不起作用
  • 一旦解决了这个问题,reduce就不起作用了,因为调用
    addValue
    return
    None
    (no return),而不是
    MyClass
    的实例。您需要更改
    addValue
    以返回
    self
  • 最后,
    lambda
    需要调用
    getValue
    ,因此应该有
    a.addValue(b.getValue())
一起:
myclass.py

class MyClass:
    def __init__(self, value):
        self.v = str(value)

    def addValue(self, value):
        self.v += str(value)
        return self

    def getValue(self):
        return self.v
import sys
from pyspark import SparkContext
from myclass import MyClass

if __name__ == "__main__":
    if len(sys.argv) != 1:
        print("Usage CC")
        exit(-1)

    data = [1, 2, 3, 4, 5, 2, 5, 3, 2, 3, 7, 3, 4, 1, 4]
    sc = SparkContext(appName="WordCount")
    d = sc.parallelize(data)
    inClass = d.map(lambda input: (input, MyClass(input)))
    reduzed = inClass.reduceByKey(lambda a, b: a.addValue(b.getValue()))
    print(reduzed.collect())
main.py

class MyClass:
    def __init__(self, value):
        self.v = str(value)

    def addValue(self, value):
        self.v += str(value)
        return self

    def getValue(self):
        return self.v
import sys
from pyspark import SparkContext
from myclass import MyClass

if __name__ == "__main__":
    if len(sys.argv) != 1:
        print("Usage CC")
        exit(-1)

    data = [1, 2, 3, 4, 5, 2, 5, 3, 2, 3, 7, 3, 4, 1, 4]
    sc = SparkContext(appName="WordCount")
    d = sc.parallelize(data)
    inClass = d.map(lambda input: (input, MyClass(input)))
    reduzed = inClass.reduceByKey(lambda a, b: a.addValue(b.getValue()))
    print(reduzed.collect())

谢谢你的回答-它解决了我的问题!也许还有一个问题:使用类/对象是明智的(例如,性能方面),还是使用元组和原语更好?谢谢原语类型应该提供更好的性能,因为Java对象需要转换为python对象来执行python函数(例如,
lambda
s),这对于原语类型来说很容易,但是需要对类进行额外的序列化。Hi@KevinS只是出于好奇:我在这个问题上也遇到了类似的情况:我将尝试使用dill。或者,我应该改变序列化机制吗?Hi@KevinS只是出于好奇:我在这个问题上也遇到了类似的情况:我将尝试使用dill。或者,我应该更改序列化机制吗?