Apache Spark:不执行联合操作

时间:2015-11-18 12:56:40

标签: java apache-spark

我知道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());
}

1 个答案:

答案 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);