我在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()中,它就可以正常工作。但是我需要广播这个变量,因为它会被重复使用。
1条答案
按热度按时间lx0bsm1f1#
根据py4j文档,如果试图将python集合传递给需要java集合的方法,则会抛出上述错误。这些文件给出了以下解决方案:
可以使用位于py4j.java\u collections模块中的以下转换器之一显式转换python集合:setconverter、mapconverter、listconverter。
这里还提供了一个例子。
大概,这个错误是在py4j试图转换
value
的属性Broadcast
对象,因此转换它可以解决问题。