计算Google App Engine中巨大列表中的唯一元素

时间:2011-04-06 13:12:01

标签: google-app-engine mapreduce tipfy

我有一个15,000,000次点击/月的网页小部件,我记录每个会话。当我想生成报告时,我想知道有多少独特的IP。在普通的SQL中,这很容易,因为我只是做了:

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

但由于应用引擎无法做到这一点,我现在正在研究如何做到这一点的解决方案。它不需要很快。

我想到的解决方案是拥有一个空的Unique-IP表,然后让MapReduce作业通过所有会话实体,如果实体的IP不在表中我将添加它并添加一个到计数器。然后我会有另一个MapReduce作业清除表格。这会疯了吗?如果是这样,你会怎么做?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果时间不重要,您可以尝试任务限制为1的taskqueue。基本上,您将使用递归任务查询一批日志记录,直到它达到DeadlineExceededError。然后,您将结果写入数据存储区,任务将使用查询结束游标/最后一条记录的键值排入队列,以启动上次停止的获取操作。

答案 1 :(得分:1)

你建议的mapreduce方法正是你想要的。不要忘记使用事务来更新任务队列任务中的记录,这将允许您与许多映射器并行运行它。

将来,减少支持可以通过一个简单的mapreduce实现这一目标,并且不会破坏您自己的交易和模型。