Python Spark,从执行器访问类静态变量

标签 python python-3.x apache-spark pyspark

我有一个类,其中有一些静态变量来保存代码的配置。我在主程序中初始化变量并希望在执行程序中访问它们。我看到的是,当我在执行器中使用它们时,它们没有初始化。想知道如何初始化执行器中的变量。

class EnvVariables:
    attributes = {}
    allTags = ["UNK"]
    similarityDicts = []
    mergeThreshold = 0.5

def readAttrConfig(cpath):
    EnvVariables.attributes.update(BLAH)
    EnvVariables.allTags.append(BLAH)

当我在主程序中打印变量时,我看到它们具有正确的值,但在执行程序中它们未初始化。

最佳答案

这是预期的行为。 Python 类在每个执行器上独立导入,因此您对驱动程序应用的任何更改在执行器线程中都不会可见。由于 Python 类不可序列化,因此在技术上不可能传播这些更改。

这里最简单的解决方案可能是使用在驱动程序上初始化的对象传递所需的配置,可以序列化并传递给执行器。

或者,您可以使用 SparkFiles 分发配置文件,并在导入包含 EnvVariables 的模块时读取这些文件:

  • envvariables.py

    from pyspark import SparkFiles
    
    class EnvVariables:
        attributes = {}
        allTags = ["UNK"]
        similarityDicts = []
        mergeThreshold = 0.5
    
    
    with open(SparkFiles.get("config")) as fr:
        EnvVariables.attributes.update({"a": 1})
        EnvVariables.allTags.append("b")
    
  • 主要脚本:

    from pyspark import SparkContext, SparkFiles
    
    sc = SparkContext()
    sc.addFile("config")
    
    from envvariables import EnvVariables
    

关于Python Spark,从执行器访问类静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35328214/

相关文章:

python - 如何从 Python 中的 HTML 页面中提取 URL

python - 如果它包含 pandas 数据框中基于字典键的子字符串,则替换整个字符串

python-3.x - 使用 python SDK 的 Azure 共享图像库 "GalleriesOperations"

python - 将Python中定义的函数更改为lambda函数

apache-spark - 如何调试 Spark 工作线程上的映射函数中的错误?

apache-spark - 带有 Spark 2.1 结构化流的 Kafka - 无法反序列化

apache-spark - Spark SQL中的哈希函数 - 不同的字符串都具有相同的哈希值

python - 如何在Python中获取唯一计数?

python - 在python中递归删除列表(列表的列表的列表...)中的空格

python-3.x - 具有嵌套行的 Seaborn 热图