我们正在为我们的应用程序使用AppEngine和数据存储区,其中我们有一个包含条目列表的中等大小的信息表。
我想总结报告中的条目列表,指明每个条目出现的次数,例如:通常在SQL中我只会使用select distinct
作为列,然后遍历每个条目并使用select count(x) where value = valueOfEntry
。
虽然计数部分很容易完成,但明显的问题是“问题”。我可以远程找到的唯一解决方案是MapReduce,大多数示例都基于Python。有this blog entry非常有用,但有点过时,因为它早于减少部分。然后是视频here以及我能够找到的更多资源。
但是,如果我不能写一个单独的实体并且我没有减少阶段,那么我真的很难理解如何构建汇总表吗?
这看起来像是一件微不足道且简单易行的事情,但需要这么多的箍,是不是没有样本或现有的报告引擎我只能插入到AppEngine而没有任何摩擦?
我看到BigQuery,但将数据移出应用引擎并进入该商店似乎是一件非常麻烦的事。我尝试将数据下载为CSV,但也遇到了很多问题。从长远来看,这似乎不是一个实际的解决方案。
答案 0 :(得分:1)
有一个document解释了mapreduce for java的一些概念。虽然它不完整,但它与python版本共享大部分架构。在该文档中,还有一个指向complete java sample mapreduce app的指针,该指针从数据存储区读取。
要编写结果,请指定Output
class。要将结果写入新的数据存储区实体,您需要创建自己的输出类。但您也可以使用blobstore(请参阅BlobFileOutput.java)。
其他替代方案是,每当您编写一个实体时,您还可以编写/更新EntityDistinct数据模型的另一个条目。
如果您打算执行复杂的报告并且现在可以预测所有需求,我建议您再次查看Big Query。 BigQuery非常强大,可以在非常大的数据集上运行。您可以检查http://code.google.com/p/log2bq/这是一个python项目,它使用mapreduce将日志加载到Big Query中。或者你也可以有一个cron作业,每隔一段时间就会获取所有新实体并将它们移动到Big Query中。
与摩擦相关,请记住这是一个无sql数据库,因此有一些优点,但有些东西本质上与SQL不同。请记住,您可以始终使用Google Cloud SQL,因为您的数据集大小有限,但您将失去复制和容错功能。
答案 1 :(得分:1)