集計インジケーター値はユーザーごとのようです。その場合、現在の座標や速度などを更新すると同時に、それらを計算してユーザーオブジェクトに直接プッシュします。それらは素晴らしく簡単です(必要に応じて、それらをさらに集約することもできます。
事前計算とは、バッチ プロセスとして使用する MapReduce を意味するのではなく、単にユーザー オブジェクトの更新時に計算することを意味します。
集計統計がユーザー全体でコンパイルされている場合は、更新時にそれらを事前に計算することもできますが、これらの集計統計を他の条件またはフィルターに対してクエリできる必要がある場合は、「合計距離を教えてください」 x 地域内のすべてのユーザーが旅行した」という場合、組み合わせの数によっては、事前計算ですべてをカバーできない場合があります。
したがって、集計統計がユーザー全体であり、何らかのフィルターを適用する必要がある場合は、データのスナップショットから計算する必要があります。ここでの 2 つのアプローチは次のとおりです。
- 2.2 の集計フレームワーク
- MapReduce
たとえば、クランチしたい履歴データが大量にあり、後ですばやく読み取るために結果を事前に計算できる場合は、 MapReduceを使用する必要があります。私の定義では、そのデータは頻繁には変更されませんが、変更されたとしても、インクリメンタル MR を使用して新しい結果を既存の計算に追加することもできます。
2.2 の集約フレームワークを使用すると、この多くをオンデマンドで実行できますが、もちろん、事前に計算された値ほど速くはありませんが、オンデマンドで実行すると MR よりもはるかに高速になります。MR で実行できる大量の結果セットには対応できませんが、パラメーター値が事前にわからないクエリには適しています。
例として、特定の緯度/経度内のユーザー統計の総和を計算したい場合、MR は使用できません。そのフィルターの組み合わせが多すぎるためです。飛ぶ。
ただし、都市ごとに必要な場合は、限られた都市のセットに固執し、それらすべてを事前に計算するだけでよいため、そこで MR を使用できると考えられます。
まとめると、集計インジケーターの値がユーザーごとのものである場合は、最初の段落で述べたように、ユーザー オブジェクトを更新するときに、ユーザー オブジェクト内の値を計算して格納することから始めます。はい、入力だけでなく値も保存していますが、それはオンザフライで計算する必要がなくなるモデルです。