为什么不建议使用parallelize方法创建emptyRDD?

时间:2017-12-07 07:24:45

标签: apache-spark parallel-processing rdd

我正在学习apache-spark并尝试创建一个空的RDD。 我有以下方法来创建一个空的RDD:

1. JavaRDD<String> emptyRDD = sc.emptyRDD();
2. List<String> emptyList = new ArrayList<String>();
   JavaRDD<String> emptyParallelRDD = sc.parallelize(emptyList, 1);

在这两种情况下,代码都可以正常运行,没有错误也没有例外。

但是对于parallelize方法的文档:

  

避免使用parallelize(Seq())来创建一个空的RDD。考虑使用没有分区的RDD的emptyRDD

我没有找到任何理由。 任何帮助,为什么我们不应该使用parallelize来创建emptyRDD?

1 个答案:

答案 0 :(得分:1)

EmptyRDD没有分区

sc.emptyRDD[Int].getNumPartitions
// Int = 0

以下将具有默认数量的没有数据的分区:

sc.parallelize(Seq[Int]()).getNumPartitions
// Int = 2

我的猜测是,在第一种情况下,涉及空RDD的任何工作都应该更快,因为没有分区将导致任何工作都没有被执行。

例如,saveAsTextFile在第一种情况下不会生成零件文件,但会在第二种情况下生成两个空零件文件。

scala> sc.emptyRDD[Int].saveAsTextFile("emptyRDDTest")

scala> sc.parallelize(Seq[Int]()).saveAsTextFile("emptySeqTest")

$ hdfs dfs -ls empty*
Found 1 items
hadoop          0 2017-12-07 02:38 emptyRDDTest/_SUCCESS
Found 3 items
hadoop          0 2017-12-07 02:39 emptySeqTest/_SUCCESS
hadoop          0 2017-12-07 02:39 emptySeqTest/part-00000
hadoop          0 2017-12-07 02:39 emptySeqTest/part-00001