Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache Spark:未执行联合操作_Java_Apache Spark - Fatal编程技术网

Java Apache Spark:未执行联合操作

Java Apache Spark:未执行联合操作,java,apache-spark,Java,Apache Spark,我知道spark做懒惰的评估 但这是预期的行为吗?? 使用以下程序,输出为20 但是如果打印声明 System.out.println("/////////////////// After "+MainRDD.count()); 如果未注释,则输出将为40 我并没有像在我的应用程序中那样做,只是为了演示,我创建了这个程序 SparkConf sparkConf = new SparkConf().setMaster("local").setAppName("JavaSparkSQL");

我知道spark做懒惰的评估

但这是预期的行为吗?? 使用以下程序,输出为20

但是如果打印声明

  System.out.println("/////////////////// After "+MainRDD.count());
如果未注释,则输出将为40

我并没有像在我的应用程序中那样做,只是为了演示,我创建了这个程序

 SparkConf sparkConf = new SparkConf().setMaster("local").setAppName("JavaSparkSQL");
JavaSparkContext sc = new JavaSparkContext(sparkConf);

JavaRDD<Integer> MainRDD;
ArrayList<Integer> list = new ArrayList<>();
JavaRDD<Integer> tmp;
for (int i = 0; i < 20; i++) {
    list.add(i);
}

MainRDD = sc.parallelize(list);// MainRDD.union(tmp);
System.out.println("//////////////////////First "+MainRDD.count());

list.clear();
for (int i = 20; i < 25; i++) {
    for (int j = 1; j < 5; j++) {
        list.add(i*j);
    }
    tmp = sc.parallelize(list);

  //      System.out.println("/////////////////// Before "+MainRDD.count());
    MainRDD = MainRDD.union(tmp);
//        System.out.println("/////////////////// After "+MainRDD.count());
    list.clear();
}

System.out.println("/////////////////// last "+MainRDD.count());
}
SparkConf SparkConf=new SparkConf().setMaster(“local”).setAppName(“JavaSparkSQL”);
JavaSparkContext sc=新的JavaSparkContext(sparkConf);
javarddmainrdd;
ArrayList=新建ArrayList();
javarddtmp;
对于(int i=0;i<20;i++){
列表.添加(i);
}
MainRDD=sc.parallelize(列表);//维护联合会(tmp);
System.out.println(“///First”+MainRDD.count());
list.clear();
对于(int i=20;i<25;i++){
对于(int j=1;j<5;j++){
增加(i*j);
}
tmp=sc.parallelize(列表);
//System.out.println(“///Before”+MainRDD.count());
MainRDD=MainRDD.union(tmp);
//System.out.println(“+MainRDD.count()之后的“///;
list.clear();
}
System.out.println(“///last”+MainRDD.count());
}

问题的根源是用于填充RDD的可变数据结构。调用
sc.parallelize(list)
时,它不会捕获
ArrayList的状态。由于在实际计算数据时输出循环时调用
clear
,因此根本没有数据

说实话,我不知道为什么在调用
count
方法时这种行为会改变。由于RDD没有被缓存,我想这是Spark或JVM内部的问题,但我甚至不会去猜测那里到底发生了什么。也许更聪明的人会知道这种行为的确切原因

为了说明发生了什么:

val arr = Array(1, 2, 3)

val rdd = sc.parallelize(arr)

(0 until 3).foreach(arr(_) = 99)
val tmp = sc.parallelize(arr)

tmp.union(rdd).collect
// Array[Int] = Array(99, 99, 99, 99, 99, 99) 
vs


@真的吗?事实上,我很惊讶它能起作用:)嗯,事实上。。。我的行为很奇怪!我认为这是由于数据结构的易变性…是否明智地就此提出问题?从我所知的任何一点来看,正如spark所做的惰性评估,除非我调用count方法/RDD上的某些操作,否则它不会被计算/修改。。因此出现了这种情况。。如果我不高兴,请纠正我wrong@Anil执行操作会评估RDD,但除非缓存RDD,否则不应持久化结果。据我所知,你每次都应该得到一个空的RDD。但我可能错了。可变数据结构是邪恶的,应该被禁止:)我知道一些关于可变对象的知识,但不明白为什么需要一个可变的RDD。RDD是不可变的。至少当你想到它们所代表的数据时不会。
val arr = Array(1, 2, 3)

val rdd = sc.parallelize(arr)
rdd.count()
// Long = 3

(0 until 3).foreach(arr(_) = 99)
val tmp = sc.parallelize(arr)

tmp.union(rdd).collect
// Array[Int] = Array(99, 99, 99, 1, 2, 3)

sc.getRDDStorageInfo
// Array[org.apache.spark.storage.RDDInfo] = Array()