10

Hadoop の 2 つのデータセット間で Natural-Join 操作を実装する方法を知っている人はいますか?

より具体的には、ここで私が正確に行う必要があるのは次のとおりです。

私は2セットのデータを持っています:

  1. (tile_number, point_id:point_info) として保存されるポイント情報。これは 1:n のキーと値のペアです。これは、すべての tile_number に対して、複数の point_id:point_info が存在する可能性があることを意味します

  2. (tile_number, line_id:line_info) として保存される行情報。これも 1:m のキーと値のペアであり、すべての tile_number に対して複数の line_id:line_info が存在する可能性があります。

ご覧のとおり、 tile_numbers は 2 つのデータセット間で同じです。ここで本当に必要なのは、各 tile_number に基づいてこれら 2 つのデータセットを結合することです。つまり、タイル番号ごとに、n 個の point_id:point_info と m 個の line_id:line_info があります。私がやりたいことは、point_id:point_info のすべてのペアを、すべての tile_number の line_id:line_info のすべてのペアと結合することです。


明確にするために、ここに例を示します。

ポイント ペアの場合:

(tile0, point0)
(tile0, point1)
(tile1, point1)
(tile1, point2)

ライン ペアの場合:

(tile0, line0)
(tile0, line1)
(tile1, line2)
(tile1, line3)

私が欲しいのは次のとおりです:

タイル 0 の場合:

 (tile0, point0:line0)
 (tile0, point0:line1)
 (tile0, point1:line0)
 (tile0, point1:line1)

タイル 1 の場合:

 (tile1, point1:line2)
 (tile1, point1:line3)
 (tile1, point2:line2)
 (tile1, point2:line3)
4

2 に答える 2

8

タイトルをキーとして出力し、ポイント/ラインを値として出力するマッパーを使用します。ポイント出力値とライン出力値を区別する必要があります。たとえば、特殊文字を使用できます (ただし、バイナリ アプローチの方がはるかに優れています)。

したがって、マップ出力は次のようになります。

 tile0, _point0
 tile1, _point0
 tile2, _point1 
 ...
 tileX, *lineL
 tileY, *lineK
 ...

次に、リデューサーで、入力は次の構造になります。

 tileX, [*lineK, ... , _pointP, ...., *lineM, ..., _pointR]

そして、次のように、ポイントとラインを分離する値を取得し、クロス積を実行してクロス積の各ペアを出力する必要があります。

tileX (lineK, pointP)
tileX (lineK, pointR)
...

ポイント値とライン値を簡単に区別できる場合 (アプリケーションの仕様によって異なります)、特殊文字 (*,_) は必要ありません。

レデューサーで行う必要があるクロス積について: 最初に値リスト全体を反復処理し、それらを 2 つのリストに分けます。

 List<String> points;
 List<String> lines;

次に、ネストされた 2 つの for ループを使用して外積を実行します。次に、結果のリストと各要素の出力を反復処理します。

tile(current key), element_of_the_resulting_cross_product_list
于 2012-08-03T21:42:46.800 に答える
1

したがって、基本的にここには 2 つのオプションがあります。サイド ジョインを減らすか、サイド ジョインをマップします。

ここで、グループキーは「タイル」です。単一のレデューサーでは、ポイント ペアとライン ペアからすべての出力を取得します。ただし、配列内のポイント ペアまたはライン ペアのいずれかをキャッシュする必要があります。ペア (ポイントまたはライン) のいずれかが非常に大きく、どちらも単一のグループ キー (それぞれの一意のタイル) の一時配列メモリに収まらない場合、この方法は機能しません。1 つのグループ キー ("タイル") のキー ペアを両方ともメモリに保持する必要はありません。1 つで十分です。

単一のグループ キーの両方のキー ペアが大きい場合は、マップ側の結合を試行する必要があります。ただし、いくつかの固有の要件があります。ただし、両方のデータに対して同数のレデューサーを実行するいくつかの map/reduce ジョブを通じてデータを前処理することで、これらの要件を満たすことができます。

于 2012-08-03T23:30:01.797 に答える