0

Reduce-Side、Replicated、Composite 結合などの結合が Hadoop フレームワークでサポートされていることを読みました。これらの結合に対する Mongodb のサポートはありますか?

私にとってのユースケースは、ログに記録された各ユーザーのイベントとその発生のコレクションがあることです。そのサンプルは

{_id: uniqueEventId, event: login, userId: abc}

ユーザーに関する詳細を含む別のコレクションがあり、ユーザーの属性は固定されていません。そのサンプルドキュメントは

{_id: abc, city: "SF", state: CA, customfield1: value1...}

必要な結果は、イベントの集計である userId であり、ユーザーの詳細も入力する必要があります。サンプル、

{userId: abc, event: login, count:23, city: SF, state: CA}

最大のログインイベントと同様の種類のクエリを持つ州または都市に基づいてクエリを実行できるようにします。

イベント ドキュメントの一部としてユーザー ドキュメントを埋め込むことを検討しましたが、ユーザー属性に変更があった場合、文字どおりすべてのイベント コレクションを更新する必要があり、巨大になります。

このリンクから 2 つのコレクションをマージする方法を調べましたが、reduce 関数を実行する必要があるキーは複合キー (userId + イベント) であるため、これはまったく役に立ちません。

4

1 に答える 1

1

この JOIN はアプリに対してリアルタイムで使用できないことに注意してください。これを行うと、MongoDB が壊れますが、はい; JOIN をマップ削減する方法があります。

最初の MR で次を取得します。

{_id: abc, city: "SF", state: CA, customfield1: value1...}

この行を発行して、新しいコレクションに書き込むだけです。次に、2 番目の MR で次のようになります。

{userId: abc, event: login, count:23, city: SF, state: CA}

あなたはuserId実際に作る_id

var map = function(){
    emit(this.userId, {this.event, //etc});
}

または複合キー:

var map = function(){
    emit({o: this.userId, e: this.event}, {this.event, //etc});
}

次に、通常どおりに縮小しますが、コマンドを変更するか、サーバーへの呼び出しを行いout、MR 内のオプションが実際に最初の MRがオプションにreduceormergeコマンドを追加した結果を指すようoutにして、2 つのコレクションを重複した_ids で結合します。

db.col.mapreduce( map, reduce, { out: {merge:collection_from_first_mr} })

それが基本的にどのように機能するかです。

この回答の最初の最初の通知に戻ります。これは SQL JOIN ではないため、そのように扱うべきではありません。JS エンジンは次のとおりです。

  • 遅い
  • シングルスレッド
  • 実際にはMongoDBまたはサーバー側ではなく、実際にはMongoDBに組み込まれたJSエンジンです

コレクションが制御不能になったり、このコマンドがアプリに対してリアルタイムで実行されたりすると、サーバー上で実行する必要がある他の JavaScript (シングル スレッドであることを思い出してください) のパフォーマンスの問題を簡単に確認できます。

編集

最大のログインイベントと同様の種類のクエリを持つ州または都市に基づいてクエリを実行できるようにします。

ログインはその都市で行われませんか?したがって、ログイン行には都市と州のフィールドが含まれている必要があります。これは更新する必要がなく、そのログインは他の場所ではなくそこで行われるため、奇妙なことに聞こえます。

巨大になるすべてのイベント コレクションを文字通り更新する必要があります。

ログインイベントは、それが記録された正しい州/都市で発生したため、更新する必要がないため、廃止されます。

したがって、実際には次のスキーマを使用します。

{_id: uniqueEventId, event: login, userId: abc, state: '', city: ''}

そして、それを集計します。

于 2012-12-31T09:14:52.767 に答える