Python 3.x PySpark覆盖添加的sc.addPyFile
我已将这2个文件保存在此路径下: C:\code\sample1\main.pyPython 3.x PySpark覆盖添加的sc.addPyFile,python-3.x,apache-spark,pyspark,Python 3.x,Apache Spark,Pyspark,我已将这2个文件保存在此路径下: C:\code\sample1\main.py def method(): return "this is sample method 1" C:\code\sample2\main.py def method(): return "this is sample method 2" 然后我运行这个: from pyspark import SparkContext from pyspark.sql import SparkSession s
def method():
return "this is sample method 1"
C:\code\sample2\main.py
def method():
return "this is sample method 2"
然后我运行这个:
from pyspark import SparkContext
from pyspark.sql import SparkSession
sc = SparkContext()
spark = SparkSession(sc)
sc.addPyFile("~/code/sample1/main.py")
main1 = __import__("main")
print(main1.method()) # this is sample method 1
sc.addPyFile("~/code/sample2/main.py") # Error
错误是
Py4JJavaError:调用o21.addFile时出错。
:org.apache.spark.sparkeexception:文件C:\Users\hans.yulian\AppData\Local\Temp\spark-5da165cf-410f-4576-8124-0ab23aba6aa3\userFiles-25a7ca23-84fb-42b7-95d9-206867fb9dfd\main.py存在并且与/C:/Users/hans.yulian/Documents/spark-test/main2/main.py的内容不匹配
这意味着它的临时文件夹中已经有“main.py”文件,并且内容不同。我想知道这个案例是否有解决办法,但对我来说,我有以下限制:
虽然技术上可行,但通过将
spark.files.overwrite
设置为“true”
:
在简单的情况下,将给出正确的结果
def f(*_):
from main import method
return [method()]
sc.addFile("/path/to/sample1/main.py")
sc.parallelize([], 3).mapPartitions(f).collect()
[“这是示例方法1”,
'这是示例方法1',
'这是示例方法1']
sc.addFile(“/path/to/sample2/main.py”)
sc.parallelize([],3).mapPartitions(f).collect()
[“这是示例方法2”,
“这是示例方法2”,
'这是示例方法2']
它在实践中是不可靠的,即使您在每次访问时都使用了模块,也会使您的应用程序难以推理。因为Spark可以隐式缓存某些对象,或者透明地重新启动Python workers,所以很容易出现这样的情况,即不同的节点看到源的不同状态
def f(*_):
from main import method
return [method()]
sc.addFile("/path/to/sample1/main.py")
sc.parallelize([], 3).mapPartitions(f).collect()