如何从 PySpark 应用程序读取 --pyfiles 提交的 zip

How to read zip submitted by --pyfiles from PySpark application

我有以下文件夹结构。我将 source 文件夹和 运行 spark-submitsource.zip 压缩为 --py-files。我的问题是,如何从 PySpark 应用程序读取 config.hcl 文件?我试过 SparkFiles.getRootDirectory()+'/source/config.hcl' 但没有用。错误说没有这样的文件或目录。非常感谢您的帮助。我正在尝试从 app.py 读取 config.hcl。我如何在 zip 中引用它?或者如何先解压?

source
  | config.hcl
app.py. 

您无法读取 config.hcl 文件的主要原因有两个:

  1. 当上传 zip 文件并通过 --py-files 提交时,包保留在 zip 文件中而不提取(例如 /private/var/folders/81/c3fgx2qx6nq3lh2v983cdcd80000gn/T/spark-043999a0-c7fb-409c-a95d-4b8a902e55f0/userFiles-c3301b1a-b47e-4411-a2e9-ef0d8c2dc347/a.zip
  2. 因为如果(1),你读config.hcl的方式有点不同,你需要用ZipFile来读

我创建了一个具有以下结构的测试文件a.zip

├── a
│   ├── __init__.py
│   ├── a.py
│   └── a.txt
# __init__.py
from .a import *

# a.py
from os import path
from zipfile import ZipFile

def test():
    zip = ZipFile(path.dirname(path.dirname(path.abspath(__file__))))
    with zip.open('a/a.txt') as f:
        print(f.readlines())

# a.txt
'Hello World'
# spark-submit --py-files a.zip ...
import a
a.test()
# 'Hello World'