pyspark py4j создать java строковый массив - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу вызвать метод main баночки FAT из Pyspark.

Вот точка входа основного метода баночки (Scala):

object Main {
  def main(args: Array[String]): Unit = {
    // codes
  }
}

Чтобы вызвать вышеупомянутый метод, мне нужно создать Array[String] с использованием py4j pyspark:

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: java .lang.String._get_object_id не существует в JVM

С простым 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)

Как создать массив строк для вызова метода main в PySpark?

1 Ответ

0 голосов
/ 25 апреля 2020

Как и в обычном Py4j, вы можете попробовать создать его, используя:

str_array = sc._jvm._gateway.new_array(sc._jvm.java.lang.String, 4)
...