我想初始化配置一次,然后在我的 PySpark 项目的许多模块中使用它。
我看到有两种方法可以做到这一点。
- 将其加载到入口点并作为参数传递给每个函数
main.py:
with open(sys.argv[1]) as f:
config = json.load(f)
df = load_df(config)
df = parse(df, config)
df = validate(df, config, strict=True)
dump(df, config)
但向每个函数传递一个外部参数似乎不太美观。
- 在config.py中加载配置并在每个模块中导入该对象
配置文件
import sys
import json
with open(sys.argv[1]) as f:
config = json.load(f)
main.py
from config import config
df = load_df()
df = parse(df)
df = validate(df, strict=True)
dump(df)
并在每个模块中添加行
from config import config
这看起来更漂亮,因为严格来说,配置并不是函数的参数。这是它们执行的一般上下文。
不幸的是,PySpark pickle config.py 并尝试在服务器上执行它,但没有将 sys.argv 传递给它们!
所以,我在运行时看到错误
File "/PycharmProjects/spark_test/config.py", line 6, in <module>
CONFIG_PATH = sys.argv[1]
IndexError: list index out of range
在 PySpark 中使用从文件加载的常规配置的最佳实践是什么?