我知道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());
}
答案 0 :(得分:2)
问题的根源是用于填充RDD的可变数据结构。当您致电ArrayList
时,它不会捕获clear
的状态。由于在实际评估数据时输出循环时调用count
,因此根本没有数据。
说实话,我不知道为什么当你调用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)
方法时这种行为会发生变化。由于RDD没有缓存,我的猜测是Spark或JVM内部的问题,但我甚至不会猜测那里真正发生了什么。也许聪明的人能够知道这种行为的确切原因。
只是为了说明发生了什么:
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()
VS。
//prespektive...
gluPerspective(45,1.0,2.0,30.0);
//look at...
gluLookAt(0.0,2.0, -4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
//try to rotate cube on bottom-right-axis
glTranslatef(-(-0.7), 0.40, -(-0.25));
glRotatef(90, 1,0,0);
glRotatef(90, 0,1,0);
glRotatef(90, 0,0,1);
glTranslatef(-0.7, 0.40, -0.25);