在PySpark中运行自定义Java类

hmo*_*rit 5 python java py4j apache-spark pyspark

我正在尝试在PySpark中运行自定义HDFS阅读器类。这个类是用Java编写的,我需要从PySpark或从shell或通过spark-submit访问它。

在PySpark中,我从SparkContext(sc._gateway)中检索JavaGateway 。

说我有一堂课:

package org.foo.module

public class Foo {

    public int fooMethod() {
        return 1;
    }

}
Run Code Online (Sandbox Code Playgroud)

我试图将其打包到一个jar中,并将其与--jar选项一起传递给pyspark,然后运行:

from py4j.java_gateway import java_import

jvm = sc._gateway.jvm
java_import(jvm, "org.foo.module.*")

foo = jvm.org.foo.module.Foo()
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误:

Py4JError: Trying to call a package.
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?谢谢。

Kar*_*pur 9

在 PySpark 中尝试以下操作

from py4j.java_gateway import java_import
java_import(sc._gateway.jvm,"org.foo.module.Foo")

func = sc._gateway.jvm.Foo()
func.fooMethod()
Run Code Online (Sandbox Code Playgroud)

确保您已将 Java 代码编译为可运行的 jar 并像这样提交 spark 作业

spark-submit --driver-class-path "name_of_your_jar_file.jar" --jars "name_of_your_jar_file.jar" name_of_your_python_file.py
Run Code Online (Sandbox Code Playgroud)

  • 另外,请记住,如果您要添加多个 jar,请确保对 --driver-class-path 和逗号分隔 --jars 使用类路径语法。 (2认同)

Nho*_*hor -1

而不是--jars您应该使用--packages将包导入到您的spark-submit操作中。