PySpark:如何解析依赖项zip文件中存在的资源文件的路径

时间:2018-11-13 12:45:29

标签: python apache-spark pyspark

我在RDD上有一个mapPartitions,在每个分区内,必须打开一个资源文件。该模块包含mapPartitions调用的方法和资源文件,使用--py-files参数作为zip文件传递给每个执行程序。

为清楚起见:

rdd = rdd.mapPartitions(work_doing_method)

def work_doing_method(rows):
    for row in rows:
        resource_file_path = os.path.join(os.path.dirname(__file__), "resource.json")
        with open(resource_file_path) as f:
            resource = json.loads(f.read())
            ...

当我使用--py-file参数将包含所有内容的zip文件传递到spark-submit命令后执行此操作时,

我得到IOError: [Errno 20] Not a directory:/full/path/to/the/file/within/zip/file

我不明白Spark如何使用zip文件读取依赖关系。 os.path.dirname实用程序返回包括zip文件的完整路径,例如。 /spark/dir/my_dependency_file.zip/path/to/the/resource/file。我相信这应该是问题所在。我尝试了多种组合来解析文件的路径。任何帮助表示赞赏。

谢谢!

2 个答案:

答案 0 :(得分:1)

我认为,当您将文件添加到Spark作业时,它将被复制到每个执行器的工作目录中。我已经使用SparkFiles API来获取执行程序上文件的绝对路径。

您还可以使用--archives标志传入任意数据存档,例如zipfile。 What's the difference between --archives, --files, py-files in pyspark job arguments

答案 1 :(得分:0)

当我们寻找绝对路径时,我们会在egg / zip文件(执行程序工作目录内)中获得资源文件的路径。我最终在Python中使用了zipfile模块,并像here一样打开了它。