【问题标题】:No attribute error passing broadcast variable from PySpark to Java function将广播变量从 PySpark 传递到 Java 函数时没有属性错误
【发布时间】:2020-07-04 16:32:09
【问题描述】:

我在 PySpark 中注册了一个 java 类,我试图将一个广播变量从 PySpark 传递给这个类中的一个方法。像这样:

from py4j.java_gateway import java_import
java_import(spark.sparkContext._jvm, "net.a.b.c.MyClass")
myPythonGateway = spark.sparkContext._jvm.MyClass()

with open("tests/fixtures/file.txt", "rb") as binary_file:
    data = spark.sparkContext.broadcast(binary_file.read())
    myPythonGateway.setData(data)

但这是在扔:

AttributeError:“广播”对象没有属性“_get_object_id”

但是,如果我直接传递 byte[],而不将其包装在 broadcast() 中,它可以正常工作。但是我需要广播这个变量,因为它会被重复使用。

【问题讨论】:

    标签: apache-spark pyspark py4j


    【解决方案1】:

    根据py4j docs,如果您尝试将 Python 集合传递给需要 Java 集合的方法,则会引发上述错误。文档给出了以下解决方案:

    您可以使用位于 py4j.java_collections 模块中的以下转换器之一显式转换 Python 集合:SetConverter、MapConverter、ListConverter。

    那里也提供了一个例子。

    大概是当py4j尝试转换Broadcast对象的value属性时发生此错误,因此转换它可能会解决问题,例如

    converted_data = ListConverter().convert(binary_file.read(),spark.sparkContext._jvm._gateway_client)
    broadcast_data = spark.sparkContext.broadcast(converted_data)
    myPythonGateway.setData(broadcast_data)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-13
      • 2015-06-27
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      • 2023-03-17
      相关资源
      最近更新 更多