1

hdfsの2つの大きなファイルを比較するためのmap reduceを書きたいです。それを達成する方法についての考え。または、ファイルサイズが非常に大きいために比較を行う方法が他にない場合は、 map-reduce が理想的なアプローチであると考えました。ご協力いただきありがとうございます。

4

3 に答える 3

0

ファイルとキーを比較するためのソリューションがあります。あなたの場合、ID が一意であることがわかっている場合は、ID をマップ内のキーとして、レコード全体を値として発行できます。ファイルに ID,Line1 があり、マッパーからキーと値として出力するとします。

シャッフルおよびソート フェーズでは、ID がソートされ、両方のファイルからのデータを含む反復子が取得されます。つまり、同じ ID を持つ両方のファイルのレコードは、同じ反復子になります。

次に、リデューサーで、イテレーターからの両方の値を比較し、一致する場合は次のレコードに進みます。一致しない場合は、それらを出力に書き込みます。

私はこれを行いましたが、それは魅力のように機能しました。

シナリオ - 一致するキー がない 2 つのファイル間に一致する ID がない場合、反復子の値は 1 つだけになります。

シナリオ 2 - 重複キー ファイルに重複キーがある場合、反復子には 2 つ以上の値が含まれます。

注:イテレータの値が 2 つしかない場合にのみ、値を比較する必要があります。**ヒント:** イテレータは常に順序どおりの値を持つとは限りません。特定のファイルの値を識別するには、マッパーで Line1;file1 Line1;file2 のように行末に小さなインジケーターを追加します。次に、リデューサーで、どの値がどのマッパーに属しているかを識別できます。

于 2015-10-29T01:35:44.623 に答える
0

考えられる解決策の 1 つは、行番号をマップ ジョブのカウントとして入れることです。以下のような 2 つのファイルがあります。

ファイル 1: 私はここにいます -- 1 行目 私は素晴らしいです -- 2 行目 あなたは私の親友です -- 3 行目

ファイル2も同様の種類

これで、マップ ジョブの出力は < I am awesome, 2>... のようになります。

両方のファイルの Map ジョブを完了すると、削減する同じ値を持つ 2 つのレコード (キー、値) ができます。

削減時に、カウンターを比較するか、出力を として生成することができます。行が出力とは異なる場所にも存在する場合は、この行が一致していないことを示している可能性があります。

于 2014-02-08T07:34:42.127 に答える
0

これは 2 つの手順で行うことができます。

  1. まず、行番号をテキスト ファイルの一部にします。

初期ファイルが次のようになっているとします。

I am awesome
He is my best friend

これを次のように変換します。

1,I am awesome
2,He is my best friend

これは、MapReduce ジョブ自体またはその他のツールによって実行される可能性があります。

   2. MapReduce ステップを記述します。このステップでは、マッパーが行番号をキーとして出力し、実際の文の残りを値として出力します。次に、レデューサーで値を比較します。一致しない場合は、必要に応じて、行番号 (キー) とペイロードを出力します。また、カウントがvalues1 の場合も不一致です。

編集:より良いアプローチ

さらに良いことは、マッパーで一度に読み取った完全な行をキーとして発行し、値を数値、たとえば 1 にすることです。上記の例を使用すると、マッパーの出力は次のようになります。

< I am awesome,1 >

< He is my best friend,1 >

レデューサーでは、 のカウントを確認するだけvaluesです。2 でない場合は、不一致があります。

ただし、このアプローチには 1 つの落とし穴があります。まったく同じ行が 2 つの異なる場所で発生する可能性がある場合は、valuesレデューサーで特定のキーの長さをチェックする代わりに、2 の倍数であることをチェックする必要があります。

于 2013-02-20T18:41:21.643 に答える