2017-02-15 11 views
1

私はsparkでファイルを処理しようとしていますが、入力ファイルに3行以上の情報の単一の "レコード"があります。spark slidingRDDで複数行レコードを読み取る

Rec1 Line1 
Rec1 Line2 
Rec1 Line3 
Rec2 Line1 
Rec2 Line2 
Rec2 Line3 

レコードの行をリンクするキーはありません。唯一の接続は、互いに隣り合う3行です。 4行目が新しいレコードの開始点であることを知らないレコードセパレータはありません。他のすべての質問は、私は何も明らかに記録区切りを持っているように見えますが、私は行数に頼らざるを得ません。

私が最初に考えたが、これは私にRDD [文字列]とRDDの各要素は、ファイルから3行であるRDD [配列[文字列]をオンorg.apache.spark.mllib.rdd.RDDFunctions

sc.textFile("myFile.txt").sliding(3,3) 

からsliding関数を使用することです。

いくつかのテストでは、これは私が望む結果を得ることができるように見えますが、sliding関数が実際に評価中にcollectを引き起こすことがわかりました。これは私に心配しています、それは何を集めていますか?それはデータファイル全体か他の何かですか?私のファイルは大きすぎてドライバにすべてを集めることはできません。

slidingは、このファイルを読む最良の方法ですか、それとももっと効率的な方法ですか?

+0

rdd.map(_。split( ""))を使用できません。map(arr =>(arr [0]、arr [1]))groupBy(_._ 2)?つまり、スペースで行を分割し、キーのrddを作成し、キーで値とグループを作成します。 – dumitru

+0

@dumitruファイルにgroupByのキーがありません。おそらく 'zipWithIndex'を使ってグループ化に使うキーを得ることができます。また、シャッフルが完全に発生します。 – puhlen

答えて

1

あなたが見るコールは、すべてのRDDデータを収集するのではなく、要約情報を分割します。 .slidingを呼び出すと、この情報を計算するのに余分な時間がテキストファイルに読み込まれますが、ドライバメモリを吹き飛ばすことはありません。

これは、Spark 2.0.2のorg.apache.spark.mllib.rdd.SlidingRDDのコードを読んだことでわかりました。

あなたの目的のために、.slidingが最善の策であるようです。

関連する問題