1

15,000,000ヒット/月のWebウィジェットを取得し、すべてのセッションをログに記録します。レポートを生成したいときは、一意のIPがいくつあるか知りたいです。通常のSQLでは、次のようにするだけで簡単です。

SELECT COUNT(*) FROM (SELECT DISTINCT IP FROM SESSIONS)

しかし、それはアプリエンジンでは不可能なので、私は現在、それを行う方法についての解決策を検討しています。高速である必要はありません。

私が考えていた解決策は、空のUnique-IPテーブルを用意し、MapReduceジョブを使用してすべてのセッションエンティティを処理することでした。エンティティのIPがテーブルにない場合は、それを追加してカウンターに追加します。次に、テーブルをクリアする別のMapReduceジョブがあります。これはクレイジーでしょうか?もしそうなら、あなたはそれをどのように行いますか?

ありがとう!

4

2 に答える 2

1

時間が重要ではなく、タスク制限が1のtaskqueueを試すことができる場合は、基本的に、DeadlineExceededErrorに達するまでログレコードのバッチをクエリする再帰タスクを使用します。次に、結果をデータストアに書き込むと、タスクはクエリ終了カーソル/最後のレコードのキー値を使用して自身をキューに入れ、前回停止した場所でフェッチ操作を開始します。

于 2011-04-06T18:26:12.807 に答える
1

あなたが提案するmapreduceアプローチは、まさにあなたが望むものです。トランザクションを使用してタスクキュータスクのレコードを更新することを忘れないでください。これにより、多くのマッパーと並行して実行できるようになります。

将来的には、reduceのサポートにより、単一の単純なmapreduceでこれが可能になり、独自のトランザクションやモデルをハッキングする必要がなくなります。

于 2011-04-07T02:52:32.087 に答える