将广播变量从pyspark传递到java函数时没有属性错误

w1jd8yoj  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(432)

我在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:'broadcast'对象没有属性'\u get\u object\u id'
但是,如果我直接传递byte[],而不将其 Package 在broadcast()中,它就可以正常工作。但是我需要广播这个变量,因为它会被重复使用。

lx0bsm1f

lx0bsm1f1#

根据py4j文档,如果试图将python集合传递给需要java集合的方法,则会抛出上述错误。这些文件给出了以下解决方案:
可以使用位于py4j.java\u collections模块中的以下转换器之一显式转换python集合:setconverter、mapconverter、listconverter。
这里还提供了一个例子。
大概,这个错误是在py4j试图转换 value 的属性 Broadcast 对象,因此转换它可以解决问题。

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

相关问题