GoogleAppEngine上的JDO:如何使用BigTable进行计数和分组

时间:2011-09-15 12:51:41

标签: java google-app-engine jdo

我需要收集有关数据存储区中实体的一些统计信息。

作为一个例子,我需要知道我有多少对象,如何 许多具有某些属性的对象设置为特定值等。 在通常的关系DBMS中,我可以使用

    SELECT COUNT(*) ... WHERE property=<some value>

    SELECT MAX(*), ... GROUP BY property

等。 但在这里我看不到任何这些结构。

此外,我无法加载内存中的所有对象(例如使用 pm.getExtent(MyCall.class,false))因为我有太多的实体(更多 超过100k)。

你知道实现我的目标的任何技巧吗?

2 个答案:

答案 0 :(得分:2)

实际上这取决于您的具体要求。

不过,有一种常见的方法,就是在后台准备这些统计数据。

例如,您可以使用Queue服务运行一些任务,这些任务将使用select x where x.property == some value + cursor + sum variable之类的查询。如果您在第一步,光标将为空,sum将为零。然后,你将迭代你的查询结果,1000项(查询限制)或9分钟(任务限制),每步增加sum,然后,如果它没有完成,用新光标调用此任务,总和值。我的意思是你将下一步的请求添加到队列中。游标很容易序列化为字符串。

当你有最后一步时 - 你必须将结果值保存到统计结果表中。

看看:

而且,这种统计/聚合的东西实际上取决于你的实际任务/要求/项目,很少有办法实现这一点,最适合不同的任务。没有标准的方法,比如SQL

答案 1 :(得分:1)

GAE对聚合功能的支持有限。这主要是BigTable的无模式特性的工件。另一种方法是自己将聚合函数维护为单独的字段,以便快速访问它们。

要做一个计数,你可以做这样的事情 -

Query q = em.createQuery("SELECT count(p) FROM your.package.Class p");
Integer i = (Integer) q.getSingleResult(); 

但是这可能只返回1000行,因为GAE将获取的行数限制为1000.

如何解决这些问题的一些有用的阅读 -

http://marceloverdijk.blogspot.com/2009/06/google-app-engine-datastore-doubts.html

Is there a way to do aggregate functions on Google App Engine?