【问题标题】:JDO on GoogleAppEngine: How to count and group with BigTableGoogleAppEngine 上的 JDO:如何使用 BigTable 进行计数和分组
【发布时间】:2011-11-17 20:54:28
【问题描述】:

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

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

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

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

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

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

你知道什么技巧可以实现我的目标吗?

【问题讨论】:

    标签: java google-app-engine jdo


    【解决方案1】:

    其实这取决于你的具体要求。

    顺便说一句,有一种常用方法可以在后台准备此统计数据。

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

    当您完成最后一步时 - 您必须将结果值保存到 stat 结果表中的某个位置。

    看看:

    而且,这个统计/聚合的东西真的取决于你的实际任务/需求/项目,实现这一点的方法很少,最适合不同的任务。没有标准的方法,就像在 SQL 中一样

    【讨论】:

    • 我已经考虑过这个策略,但我需要一个管理页面的分组结果,它应该实时更新(最多延迟 15 分钟)。我不能每 15 分钟运行一次后台任务,因为我的 CPU 时间配额会耗尽!!!
    • 只有在数据发生变化时才能运行(见前瞻性搜索)
    • 顺便说一句,如果你真的需要聚合查询,需要经常运行它,现在有办法准备数据——也许 appengine 不适合你
    【解决方案2】:

    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?

    【讨论】:

    • “软模式”和“分片”与自己维护计数和聚合无关 - 那是“非规范化”。
    • 在我的架构中,有一堆非常少的对象,添加得非常频繁......我无法维护聚合函数,因为我有太多的参数和太多的记录需要维护
    猜你喜欢
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    相关资源
    最近更新 更多