【发布时间】:2013-04-15 21:06:06
【问题描述】:
我读到的每一个地方,人们都说您不应该在整个存储桶上使用 Riak 的 MapReduce,并且还有其他方法可以实现您的目标。不过,我不确定如何。我也不清楚为什么使用整个存储桶很慢,如果您在整个系统中只有 一个存储桶,那么无论哪种方式,您都需要检查所有条目。
我有一个包含 500K+ 文档的列表,这些文档代表了销售数据。我需要以不同的方式查看这些数据:例如,企业运营每个月的收入是多少?每个产品增加了多少收入?在给定的一个月内,每种产品销售了多少?我一直认为 MapReduce 应该擅长解决这些类型的聚合问题,所以如果你已经拥有所有的键(你必须以某种方式搜索它们,对吗?),我很困惑 MapReduce 的用途。
我的文档都在名为“sales”的存储桶中,它们是具有以下字段的记录:{"id":1, "product_key": "cyber-pet-toy", "price": "10.00", "tax": "1.00", "created_at": 1365931758}。
让我们举个例子,我需要报告过去 4 年中每个月每个产品的总收入(基本上是整个桶),如何使用 Riak 的 MapReduce 有效地做到这一点?即使只是尝试对数据使用身份映射操作,我也会在大约 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;
(排序现在不重要)。
【问题讨论】:
-
好的,我明白了,Riak 并不是为处理大量数据而生的。许多示例让您相信它是(遍历 facebook 朋友的图表、处理大量推文等),但实际上 Riak 只是一个关键值存储。它的 MapReduce 实际上毫无意义,因为要真正执行它,您正在处理的数据量如此之低,以至于您可以在客户端执行它。我会尝试其他 MapReduce 数据库进行比较,因为这可能是 MapReduce 的一般问题。