首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >py4j创建java字符串数组

py4j创建java字符串数组
EN

Stack Overflow用户
提问于 2020-04-15 14:00:19
回答 2查看 939关注 0票数 0

我想调用main方法的胖罐子从火花公子。

以下是jar的主要方法(Scala)的入口点:

代码语言:javascript
复制
object Main {
  def main(args: Array[String]): Unit = {
    // codes
  }
}

为了调用上面的方法,我需要使用pyspark的Array[String]创建一个py4j:

代码语言:javascript
复制
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,我可以使用以下方法创建字符串数组:

代码语言:javascript
复制
from py4j.java_gateway import JavaGateway
gateway = JavaGateway()
gateway.new_array(gateway.jvm.java.lang.String, 4)

我试图将对象数组传递给main,但没有成功:

代码语言:javascript
复制
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)

失败时出错:

代码语言:javascript
复制
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方法的字符串数组?

EN

回答 2

Stack Overflow用户

发布于 2020-11-06 15:19:42

要将某些python字符串列表(arr)转换为pyspark中的java字符串数组,您可以使用toJStringArray下面的函数:

代码语言:javascript
复制
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是火花上下文的预定义全局。

票数 2
EN

Stack Overflow用户

发布于 2020-04-24 22:31:43

类似于普通的Py4j,您是否可以尝试使用以下方法创建它:

代码语言:javascript
复制
str_array = sc._jvm._gateway.new_array(sc._jvm.java.lang.String, 4)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61230680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档