Apache spark 使用Py4J调用一个方法,该方法接受JavaSparkContext并返回JavaRDD<;整数>;

Apache spark 使用Py4J调用一个方法,该方法接受JavaSparkContext并返回JavaRDD<;整数>;,apache-spark,py4j,Apache Spark,Py4j,我正在寻找一些帮助或示例代码,说明pyspark在spark本身之外调用用户编写的Java代码,该代码从Python中获取spark上下文,然后返回在Java中构建的RDD 为了完整起见,我使用的是Py4J0.81、Java8、Python2.7和spark 1.3.1 下面是我在Python半部分中使用的内容: import pyspark sc = pyspark.SparkContext(master='local[4]', appNam

我正在寻找一些帮助或示例代码,说明pyspark在spark本身之外调用用户编写的Java代码,该代码从Python中获取spark上下文,然后返回在Java中构建的RDD

为了完整起见,我使用的是Py4J0.81、Java8、Python2.7和spark 1.3.1

下面是我在Python半部分中使用的内容:

import pyspark
sc = pyspark.SparkContext(master='local[4]',
                          appName='HelloWorld')

print "version", sc._jsc.version()

from py4j.java_gateway import JavaGateway
gateway = JavaGateway()

print gateway.entry_point.getRDDFromSC(sc._jsc)
Java部分是:

import java.util.Map;
import java.util.List;
import java.util.ArrayList;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;

import py4j.GatewayServer;

public class HelloWorld 
{
   public JavaRDD<Integer> getRDDFromSC(JavaSparkContext jsc)
   {
      JavaRDD<Integer> result = null;
      if (jsc == null)
      {
         System.out.println("XXX Bad mojo XXX");

         return result;
      }

      int n = 10;
      List<Integer> l = new ArrayList<Integer>(n);
      for (int i = 0; i < n; i++) 
      {
         l.add(i);
      }

      result = jsc.parallelize(l);

      return result;
   }

   public static void main(String[] args)
   {
      HelloWorld app = new HelloWorld();
      GatewayServer server = new GatewayServer(app);
      server.start();
   }
}
问题似乎是我没有正确地将
JavaSparkContext
从Python传递到Java。当我使用python
sc.\u scj.sc()
时,
JavaRDD
null
时,也会发生同样的故障


调用使用Python spark的用户定义Java代码的正确方法是什么?

因此,我在一个分支中有一个这样的例子,我正在为该分支工作,该分支位于,PR位于

目前看来,您有两个不同的网关服务器,这可能会导致一些问题,相反,您可以使用现有的网关服务器并执行以下操作:

sc._jvm.what.ever.your.class.package.is.HelloWorld.getRDDFromSC(sc._jsc)
假设您也将其作为静态方法

$ spark-1.3.1-bin-hadoop1/bin/spark-submit --class "HelloWorld" --master local[4] target/hello-world-1.0.jar
XXX Bad mojo XXX
sc._jvm.what.ever.your.class.package.is.HelloWorld.getRDDFromSC(sc._jsc)