2017-12-07 11 views
1

私はapache-sparkを学び、空のRDDを作成しようとしています。 私は空のRDDを作成するには、次の方法だ:parallelizeメソッドを使用してemptyRDDを作成するのはなぜお勧めしませんか?

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

を、コードはどちらの場合も、エラーなしなし例外では完全に正常に動作します。

しかし、並列化方法の文書化のよう:空のRDDを作成するために、(配列を())並列使用

避けます。パーティションのないRDDの場合はemptyRDDを考慮してください。

これは何も理由がありませんでした。 何か助けを借りて、なぜ私たちはemptyRDDを作成するために並列化を使用すべきではありませんか?

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

私の推測では、どんな仕事が関与、最初のケースでは、次のようになります。

答えて

1

EmptyRDDは、以下のデータのないパーティションのデフォルト数を持つことになりますのに対し、ゼロのパーティション

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

を持っていますパーティションがないとジョブがまったく実行されないため、空のRDDはすばやくなります。

たとえば、saveAsTextFileは、最初のケースではパーツファイルを生成しませんが、2番目のケースでは2つの空のパーツファイルを生成します。

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 
関連する問題