アイテムのペアで何らかの評価を行うのは一般的なタスクです。例: 重複除外、協調フィルタリング、類似アイテムなど これは基本的に、同じデータ ソースとの自己結合または交差積です。
2 に答える
自己結合を行うには、「縮小側結合」パターンに従うことができます。マッパーは、結合/外部キーをキーとして発行し、レコードを値として発行します。
したがって、次のデータの「都市」(中央の列) で自己結合を実行したいとします。
don,baltimore,12
jerry,boston,19
bob,baltimore,99
cameron,baltimore,13
james,seattle,1
peter,seattle,2
マッパーはキーと値のペアを発行します。
(baltimore -> don,12)
(boston -> jerry,19)
(baltimore -> bob,99)
(baltimore -> cameron,13)
(seattle -> james,1)
(seattle -> peter,2)
レデューサーでは、これを取得します。
(baltimore -> [(don,12), (bob,99), (cameron,13)])
(boston -> [(jerry,19)])
(seattle -> [(james,1), (peter,2)])
ここから、必要に応じて内部結合ロジックを実行できます。これを行うには、すべてのアイテムを他のすべてのアイテムと一致させるだけです。これを行うには、データを配列リストにロードし、項目を N x N ループして相互に比較します。
reduce-side join はコストがかかることを認識してください。何も除外しない場合、ほとんどすべてのデータがレデューサーに送信されます。また、データをレデューサーのメモリにロードする際にも注意してください。配列リスト内のすべてのデータをロードすることで、ホット ジョイン キーのヒープを吹き飛ばしてしまう可能性があります。
上記は、通常の reduce-side join とは少し異なります。2 つのデータ セットを結合する場合も考え方は同じです。外部キーがキーで、レコードが値です。唯一の違いは、値が 2 つ以上のデータ セットから取得される可能性があることです。を使用MultipleInputs
して、さまざまなマッパーにさまざまな入力セットを解析させ、リデューサーに両方からデータを収集させることができます。
制約がない場合の外積は悪夢です。すなわち、
select * from tablea, tableb;
これを行うにはいくつかの方法があります。それらのどれも特に効率的ではありません。この種の動作が必要な場合は、コメントを残してください。これを行う方法を説明するために、さらに時間を費やします。
類似性の基本的なキーである何らかの結合キーを見つけ出すことができれば、はるかに良い結果が得られます。
私の本のプラグイン: MapReduce Design Patterns。数か月以内に公開される予定ですが、本当に興味がある場合は、結合に関する章をメールでお送りできます。
一般に、レデューサーを使用して、結合に必要なロジックを実行します。秘訣は、データセットを 2 回マップすることです。値にマーカーを追加して、どちらの実行かを示すことができます。その場合、自己結合は他の種類の結合と同じです。