Pyspark - 在地图变换中使用自定义函数

时间:2016-06-07 07:48:09

标签: python apache-spark pyspark

我使用test_func.py运行以下文件(名为py.test):

import findspark
findspark.init()
from pyspark.context import SparkContext

def filtering(data):
    return data.map(lambda p: modif(p)).count()

def modif(row):
    row.split(",")   

class Test(object):
    sc = SparkContext('local[1]')

    def test_filtering(self):
        data = self.sc.parallelize(['1','2', ''])
        assert filtering(data) == 2

并且,因为在modif转换中使用了map函数,所以它失败并出现以下错误:

org.apache.spark.api.python.PythonException: Traceback (most recent call last):
  File "/home/osboxes/spark-1.5.2-bin-hadoop2.4/python/lib/pyspark.zip/pyspark/worker.py", line 98, in main
    command = pickleSer._read_with_length(infile)
  File "/home/osboxes/spark-1.5.2-bin-hadoop2.4/python/lib/pyspark.zip/pyspark/serializers.py", line 164, in _read_with_length
    return self.loads(obj)
  File "/home/osboxes/spark-1.5.2-bin-hadoop2.4/python/lib/pyspark.zip/pyspark/serializers.py", line 422, in loads
    return pickle.loads(obj)
ImportError: No module named clustering.test_func

pyspark无法找到modif功能。请注意,文件test_func.py位于clustering目录中,我从py.test目录中运行clustering

让我感到惊讶的是,如果我在modif之外使用map函数,它就可以正常工作。例如,如果我这样做:modif(data.first())

我知道为什么会出现这样的importErrors以及如何修复它?

修改

  1. 我已经测试了Avihoo Mamka的答案,即将test_func.py添加到复制到所有工作人员的文件中。但是,它没有任何效果。这对我来说并不奇怪,因为我认为创建spark应用程序的主文件总是发送给所有工作人员。
  2. 我认为这可能来自 pyspark 正在寻找 clustering.test_func 而不是 {{ 1}}。

1 个答案:

答案 0 :(得分:1)

这里的关键是你得到的Traceback

PySpark告诉您工作进程无法访问clustering.test_func.py。初始化SparkContext时,您可以传递应该复制到worker的文件列表:

sc = SparkContext("local[1]", "App Name", pyFiles=['MyFile.py', 'lib.zip', 'app.egg'])

更多信息:https://spark.apache.org/docs/1.5.2/programming-guide.html