2016-10-27 11 views
3

RDDの各要素が区切り文字で区切られたファイルのセクションであるファイルからRDDを構築しました。フィルタ機能を使用せずにRDDの最初の要素を削除

val inputRDD1:RDD[(String,Long)] = myUtilities.paragraphFile(spark,path1) 
               .coalesce(100*spark.defaultParallelism) 
               .zipWithIndex() //RDD[String, Long] 
               .filter(f => f._2!=0) 

私は(フィルター)の上に最後の操作を行う理由は、最初のインデックス0

を削除することです最初の要素を削除するのではなく、インデックス値のための各要素をチェックするために良い方法はあります上記のように?

ありがとうございます!

答えて

4

一つの可能​​性はRDD.mapPartitionsWithIndexを使用すると、インデックス0でイテレータから最初の要素を削除することです:

val inputRDD = myUtilities 
       .paragraphFile(spark,path1) 
       .coalesce(100*spark.defaultParallelism) 
       .mapPartitionsWithIndex(
        (index, it) => if (index == 0) it.drop(1) else it, 
        preservesPartitioning = true 
       ) 

この道を、あなたは今まで他のすべてがそのまま残っている最初のイテレータ、上の単一の項目を進めます。これはより効率的ですか?多分。とにかく、両方のバージョンをテストして、どちらが優れているかを確認します。

+0

ありがとうございます。これはおよそ10秒ほど良いと思われます。これをさまざまなファイルサイズでテストする必要があります。 – user1384205

関連する問題