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



我在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。我认为这应该是问题所在。我尝试了许多组合来解析文件的路径。感谢您的帮助。

谢谢!

我认为当你向Spark作业添加一个文件时,它会被复制到每个执行器的工作目录中。我使用了SparkFiles API来获取执行器上文件的绝对路径。

您还可以使用--archives标志传入任意的数据档案,例如zipfiles。什么';pyspark作业参数中的--archives、--files、py文件之间的区别是什么

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

最新更新