私が読んだどこでも、Riak の MapReduce をバケツ全体に使用するべきではなく、目標を達成する他の方法があると言う人がいます。方法はわかりませんが。また、システム全体でバケットが 1 つしかない場合、バケット全体を使用すると遅い理由も明確ではないため、いずれにせよ、すべてのエントリを確認する必要があります。
売上データを表す 50 万以上のドキュメントのリストがあります。このデータをさまざまな方法で表示する必要があります。たとえば、事業が運営されていた各月の収益はいくらですか? 各製品の収益はいくらですか? 特定の月に各製品が何個売れたか? MapReduce はこの種の集約問題を解決するのに適しているはずだといつも思っていたので、すでにすべてのキーを持っている場合に MapReduce がどのように使用されるのか混乱しています (何らかの方法でそれらを検索する必要がありますよね?)。
私のドキュメントはすべて「sales」という名前のバケットにあり、次のフィールドを持つレコードです: {"id":1, "product_key": "cyber-pet-toy", "price": "10.00", "tax": "1.00", "created_at": 1365931758}
.
過去 4 年間の各月の各製品の総収益 (基本的にはバケット全体) を報告する必要がある例を見てみましょう。Riak の MapReduce を使用してそれを効率的に行うにはどうすればよいでしょうか? データに対して ID マップ操作を使用しようとしても、約 30 秒後にタイムアウトになり、MySQL はミリ秒単位で処理します。
私はこれを Erlang で (プロトコル バッファー クライアントを使用して) 行っていますが、説明にはどの言語でも問題ありません。
同等の SQL (MySQL) は次のようになります。
SELECT SUM(price) AS revenue,
FROM_UNIXTIME(created_at, '%Y-%m') AS month,
product_key
FROM sales
GROUP BY month, product_key
ORDER BY month ASC;
(注文は今のところ重要ではありません)。