从 RDD 转换后得到空 Java 列表

Getting empty Java List after converting from RDD

我在应用程序的第一部分创建一个 RDD,然后使用 rdd.collect() 将其转换为列表。

但出于某种原因,列表大小在应用程序的第二部分变为 0,而我从中创建列表的 RDD 不是 empty.Even rdd.toArray()给出空列表。

下面是我的程序。

 public class Query5kPids implements Serializable{

 List<String> ListFromS3 = new ArrayList<String>();

 public static void main(String[] args) throws JSONException, IOException, InterruptedException, URISyntaxException {


        SparkConf conf = new SparkConf();
        conf.setAppName("Spark-Cassandra Integration");
        conf.set("spark.cassandra.connection.host", "12.16.193.19");
        conf.setMaster("yarn-cluster");

        SparkConf conf1 = new SparkConf().setAppName("SparkAutomation").setMaster("yarn-cluster");

        Query5kPids app1 = new Query5kPids(conf1);
        app1.run1(file);

        Query5kPids app = new Query5kPids(conf);
        System.out.println("Both RDD has been generated");
        app.run();

}

private void run() throws JSONException, IOException, InterruptedException {

        JavaSparkContext sc = new JavaSparkContext(conf);
        query(sc);
        sc.stop();
}

private void run1(File file) throws JSONException, IOException, InterruptedException {
         JavaSparkContext sc = new JavaSparkContext(conf);
         getData(sc,file);
         sc.stop();

}

    private void getData(JavaSparkContext sc, File file) {

         JavaRDD<String> Data = sc.textFile(file.toString());
         System.out.println("RDD Count is " + Data.count());
         // here it prints some count value
         ListFromS3 = Data.collect();
         // ListFromS3 = Data.toArray();

    }
     private void query(JavaSparkContext sc) {

         System.out.println("RDD Count is " + ListFromS3.size());
         // Prints 0
         // So cant convert the list to RDD
         JavaRDD<String> rddFromGz = sc.parallelize(ListFromS3);

    }


  }

注意->在实际程序中,RDD和List是类型

List<UserSetGet> ListFromS3 = new ArrayList<UserSetGet>();
JavaRDD<UserSetGet> Data = new ....

其中 UserSetGet 是一个 Pojo ,具有 Setter 和 getter 方法,及其可序列化。

app1.run1将RDD内容放入app1.ListFromS3。然后你看app.ListFromS3,里面是空的。 app1.ListFromS3app.ListFromS3 是两个不同对象上的字段。设置一个不设置另一个。

我想你的意思是 ListFromS3static,意思是它属于 Query5kPids class,而不是属于特定的实例。像这样:

static List<String> ListFromS3 = new ArrayList<String>();