从RDD转换后获取空Java列表

时间:2016-03-09 17:32:20

标签: java apache-spark spark-cassandra-connector

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

但由于某种原因,列表大小在应用程序的第二部分中变为0,而我创建列表的RDD不为空。即使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);

    }


  }

注 - &gt;在实际程序中,RDD和List是类型。

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

其中UserSetGet是Pojo,使用Setter和getter方法,以及它的Serializable。

1 个答案:

答案 0 :(得分:1)

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

我认为你的意思是ListFromS3static,这意味着它属于Query5kPids类,而不是特定的实例。像这样:

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