我使用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以及如何修复它?
修改
test_func.py
添加到复制到所有工作人员的文件中。但是,它没有任何效果。这对我来说并不奇怪,因为我认为创建spark应用程序的主文件总是发送给所有工作人员。 pyspark
正在寻找 clustering.test_func
而不是 {{ 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