Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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 3.x PySpark覆盖添加的sc.addPyFile_Python 3.x_Apache Spark_Pyspark - Fatal编程技术网

Python 3.x PySpark覆盖添加的sc.addPyFile

Python 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

我已将这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

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”文件,并且内容不同。我想知道这个案例是否有解决办法,但对我来说,我有以下限制:

  • 文件名仍然必须是“main.py”,只能是文件夹 不同的
  • 可以清除临时文件夹以添加aga
  • 在另一个文件中,我唯一的解决方案是添加随机变量 main.py前面的字符串,例如abcdemain.pyfghijmain.py,然后我将导入main=\uuu import\uuuu(“abcdemain”), 但这一条并不可取

  • 虽然技术上可行,但通过将
    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()