2017-08-22 15 views
0

私はレコード(この場合はcsvファイル)を読み込み、処理するためにSparkを使用しています。ファイルはすでに何らかの順序で入っていますが、この順序はどの列にも反映されません(時系列として考えるが、タイムスタンプ列はなく、各行はファイル内の相対的な順序にある​​)。 Spark処理でこの注文情報を使用して、前の行と行を比較するなどの作業を行いたいとします。注文列がないので、レコードを明示的に注文することはできません。Sparkは、順序付けされたファイルを読み込むときにレコードの順序を保持しますか?

Sparkはファイルから読み込んだレコードの順序を維持していますか?または、Sparkからレコードのファイルオーダーにアクセスする方法はありますか?

答えて

1

はい、ファイルから読み取ると、Sparkはレコードの順序を維持します。しかし、シャフリングが発生すると、その順序は保持されません。したがって、順序を保持するには、データにシャフリングが発生しないようにプログラミングするか、seqを作成する必要があります。レコードに数値を付け、それらのseqを使用します。処理中の数字

データが高速処理のためにクラスタに分割されるSparkのような配布フレームワークでは、データのシャッフルが確実に行われます。そのため、最良の解決策は、各行に順次番号を作成し、その順序番号を順序付けに使用することです。

+0

複数の並列タスクを持つ大きなHDFSファイルを読み込んで複数のパーティションを作成する場合、* order *という概念をどのように持つことができますか? OK、最初の分割を処理していることを「推測」することができます(存在する場合はヘッダーをスキップすることができます)。ただし、連続した行番号の場合、どのような使い方をしますか? –

+0

入力データが既に分割されている場合、hadoopファイルシステムの場合のように順序付けを期待できません。その場合、hdfsにファイルを格納する前に、順次番号を設定する必要があります。 –

+0

@RameshMaharjan多くのファイルからデータセットを読み込み、各パーティションに1つずつ行くと、ファイルオーダーが各パーティション内で維持されていると仮定しますが、パーティション/ファイル間で順序保証はできません。 –

1

データがシャッフルされても、順序は保持されません。ただし、計算を実行する前に行を列挙できます。 RDDを使用している場合は、検索しているものを正確に実行するzipWithIndexRDD[T] => RDD[(T, Long)])という関数があります。

関連する問題