0

我在一个会计系统中工作,该系统接收(通过队列)关于可以创建(使用类型)、修改和销毁的不同元素的使用事件。我每个月可以有大约 1000000 个事件。

在月底,系统必须汇总信息以生成包含给定元素已使用次数的报告。我确信我还需要执行每日聚合。

举个例子就更清楚了。这些是我收到的事件类型:

{event: "create", date: "2013/01/01", element_id: 1, element_type: "L"}
{event: "modify", date: "2013/02/05", element_id: 1, element_type: "XL"}
{event: "modify", date: "2013/02/07", element_id: 1, element_type: "L"}
{event: "destroy", date: "2013/02/08", element_id: 1}

这应该是“二月”的结果:

-- from 2013/02/01 to 2013/02/05 + 2013/02/07 to 2013/02/08
{element: "1", element_type: "L", units: "6 days" }
-- from 2013/02/05 to 2013/02/07
{element: "1", element_type: "XL", units: "2 days" }

我主要关心的是如何跟踪在以前的时间间隔(例如 2 年前)中创建但仍未以有效方式销毁的元素。

你知道任何可以解决这个问题的算法吗?我一直在考虑 map-reduce 过程,但我不确定它如何适合(按月过滤,跟踪前几个月创建的元素等)。欢迎任何想法。

如果有帮助,我目前正在使用 nodejs 和 mongodb 来存储事件,但如果这有任何优势,我可以使用 java 和/或 mysql。

谢谢你。

4

1 回答 1

0

有很多方法可以解决这个问题,很难给你一个好的答案。我要做的就是给你一些建议。

  1. 就像您已经提到构建一个 mapreduce,或者如果您的数据允许,甚至更好地使用新的聚合框架。这是相当数量的数据,因此您可能需要更频繁地聚合。
  2. 更频繁地聚合,比如每天,并将这些数据存储在新的集合或不同的数据存储中,并通过每日计划的聚合任务添加到其中。这样在月底您只需对每月数据进行一次简单的查询。
  3. Hadoop!

如果#2 对您来说似乎是一条不错的路线,您可能希望考虑使用星型模式来存储您的日常聚合,并可能存储在 RDBMS 中。不仅可以很好地构建工具,而且市场上有许多产品可以很好地连接到星形/雪花模式数据进行分析。

听起来像一个有趣的项目!

于 2013-04-02T22:29:54.223 回答