首页 > 解决方案 > PySpark:如何解析依赖项 zip 文件中存在的资源文件的路径

问题描述

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

说清楚:

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())
            ...

当我使用参数将包含所有这些的 zip 文件传递--py-file​​给 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. 我相信这应该是问题所在。我尝试了很多组合来解析文件的路径。任何帮助表示赞赏。

谢谢!

标签: pythonapache-sparkpyspark

解决方案


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

您还可以使用该--archives标志传递任意数据存档,例如 zipfile。pyspark作业参数中的--archives,--files,py-files有什么区别


推荐阅读