从 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.ListFromS3
和 app.ListFromS3
是两个不同对象上的字段。设置一个不设置另一个。
我想你的意思是 ListFromS3
是 static
,意思是它属于 Query5kPids
class,而不是属于特定的实例。像这样:
static List<String> ListFromS3 = new ArrayList<String>();
我在应用程序的第一部分创建一个 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.ListFromS3
和 app.ListFromS3
是两个不同对象上的字段。设置一个不设置另一个。
我想你的意思是 ListFromS3
是 static
,意思是它属于 Query5kPids
class,而不是属于特定的实例。像这样:
static List<String> ListFromS3 = new ArrayList<String>();