0

MapReduce を使用して、並列化されたレコード結合システムを構築することを検討しています。言語は問題ではありません。Hadoop などの既存のライブラリを使用することも、必要に応じて独自のライブラリを構築することもできます。それについては心配していません。

しかし、私が常に直面している問題は、レコードを複数の条件で一致させる必要があるということです。例: 個人の名前または電話番号に基づいてレコードを照合する必要がある場合がありますが、必ずしも個人の名前電話番号ではありません。

たとえば、各レコードに次のキーがあるとします。

  1. 「ジョン・スミス」および「555-555-5555」
  2. 「ジェーン・スミス」および「555-555-5555」
  3. 「ジョン・スミス」および「555-555-1111」

システムに 3 つのレコードすべてを取得し、それらがキーの 1 つで一致することを確認し、それらを結合して、両方の名前 ('John Smith' と 'Jane Smith') と両方の電話番号を持つ単一の結合レコードにします。 (「555-555-5555」および「555-555-1111」)。

これは MapReduce を使用して達成できるものですか? もしそうなら、一致したすべてのレコードをReduce関数に渡すことができるように、Map関数によって生成されたキーをどのように一致させますか.*または、これを行うことができる別の/より良い方法はありますか? 私の唯一の本当の要件は、並列化する必要があることです。

[*] 注意: 私は、Reduce 関数がジョブ全体に対して 1 つの結果を生成するのではなく、Reduce 関数の各呼び出しが 1 つの結合されたレコードを生成するような方法で Reduce 関数を使用できると想定しています。

4

2 に答える 2

1

map/reduce パラダイムでこれを確実に行うことができます。

「smith」または「555」で始まる電話番号を含むものを照合するとします。たとえば、検索文字列を「smith|^555」に正規化します。マップ フェーズでは、次のようにします。

  • ジョン・スミス / 555-555-5555 K: smith|^555, V = (ジョン・スミス,555-555-5555)
  • Jane Doe / 555-555-5555 K: smith|^555, V = (Jane Doe,555-555-5555)
  • ジョン・スミス / 555-555-1111 K: smith|^555, V = (ジョン・スミス,555-555-1111)

それらにすべて同じキー ("smith|^555") を与えたので、それらはすべて同じレデューサー インスタンスに渡され、入力として取得されます。

K: スミス|^555, V: [(John Smith,555-555-5555),(Jane Smith,555-555-5555),(John Smith,555-555-1111))

ここで、リデューサー ステップで、名前のハッシュセットと数値の別のハッシュセットをインスタンス化し、値の配列の処理が完了したら、名前ハッシュセットのすべてのキーと数値ハッシュセットのすべてのキーを出力できます。

于 2010-01-07T02:18:13.233 に答える
0

レコードのグループを識別するのに役立つ意味のあるキーをレコードごとに実際に作成することはできないため、Map はここでは役に立たないと思います。

Reduce を使用してこれを実装することもできません。あなた自身が挙げた例を考えてみてください...「Jane Smith」をクエリすると、最初のレコードがクエリに関連していることをその時点で検出できないため、それを無視します。実際、ファイル内のすべてのレコードを取得するまで、名前と番号を連鎖させることになる可能性があります。すべての一致を取得する唯一の方法は、新しいリンクが見つからなくなるまでリストを繰り返しスキャンすることです。

ただし、これは非常に簡単に並列化できます。いくつかのスレッド間でレコードを共有するだけで、それぞれが独自のレコードを検索して新しいリンクを見つけることができます。これらのセットをデータのリングとして扱うことをお勧めします。これにより、検索していたポイントを最新の情報で記録でき、すべてのスレッドが完全なループを実行したら終了したことがわかります。

于 2009-12-13T20:05:34.493 に答える