我在应用程序的第一部分创建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。
答案 0 :(得分:1)
app1.run1
将RDD内容放入app1.ListFromS3
。然后你看app.ListFromS3
,这是空的。 app1.ListFromS3
和app.ListFromS3
是两个不同对象上的字段。设置一个不会设置另一个。
我认为你的意思是ListFromS3
为static
,这意味着它属于Query5kPids
类,而不是特定的实例。像这样:
static List<String> ListFromS3 = new ArrayList<String>();