我想调用main方法的胖罐子从火花公子。
以下是jar的主要方法(Scala)的入口点:
object Main {
def main(args: Array[String]): Unit = {
// codes
}
}为了调用上面的方法,我需要使用pyspark的Array[String]创建一个py4j:
str_array = sc._jvm.java.lang.reflect.Array.newInstance(sc._jvm.java.lang.String, 3)
str_array[0] = "228"
loaded_class = sc._jvm.java.lang.Thread.currentThread().getContextClassLoader().loadClass("com.mycompany.Main")
loaded_class.main(str_array)这就是我遇到的错误:
Py4JError: JVM中不存在java.lang.String._get_object_id
使用普通的Py4j,我可以使用以下方法创建字符串数组:
from py4j.java_gateway import JavaGateway
gateway = JavaGateway()
gateway.new_array(gateway.jvm.java.lang.String, 4)我试图将对象数组传递给main,但没有成功:
ob = sc._jvm.java.lang.Object()
ob_array = sc._jvm.java.lang.reflect.Array.newInstance(ob.getClass(), 3)
ob_array[0] = "228"
loaded_class = sc._jvm.java.lang.Thread.currentThread().getContextClassLoader().loadClass("com.mycompany.Main")
loaded_class.main(ob_array)失败时出错:
Py4JError: An error occurred while calling o516.main. Trace:
py4j.Py4JException: Method main([class [Ljava.lang.Object;]) does not exist
at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:318)
at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:326)
at py4j.Gateway.invoke(Gateway.java:274)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.GatewayConnection.run(GatewayConnection.java:238)
at java.lang.Thread.run(Thread.java:748)如何在PySpark中创建调用main方法的字符串数组?
发布于 2020-11-06 15:19:42
要将某些python字符串列表(arr)转换为pyspark中的java字符串数组,您可以使用toJStringArray下面的函数:
def toJStringArray(arr):
jarr = sc._gateway.new_array(sc._jvm.java.lang.String, len(arr))
for i in range(len(arr)):
jarr[i] = arr[i]
return jarr
# Usage example:
java_arr = toJStringArray(['string1'])我在azure databricks中运行这段代码。因此,sc是火花上下文的预定义全局。
发布于 2020-04-24 22:31:43
类似于普通的Py4j,您是否可以尝试使用以下方法创建它:
str_array = sc._jvm._gateway.new_array(sc._jvm.java.lang.String, 4)https://stackoverflow.com/questions/61230680
复制相似问题