如何计算谷歌数据存储列的总和

时间:2014-07-31 11:28:51

标签: python-2.7 google-app-engine google-cloud-datastore

我正在webbapp2框架中编写应用程序

我的数据库是

class SurveyFaculty(db.Model):
name = db.StringProperty()
clas = db.StringProperty()
roll_no = db.IntegerProperty()
semester = db.IntegerProperty()
q11 = db.IntegerProperty()
q12 = db.IntegerProperty()
q13 = db.IntegerProperty()
q14 = db.IntegerProperty()
q15 = db.IntegerProperty()
q21 = db.IntegerProperty()
q22 = db.IntegerProperty()
q23 = db.IntegerProperty()
q24 = db.IntegerProperty()
q25 = db.IntegerProperty()
q31 = db.IntegerProperty()
q32 = db.IntegerProperty()
q33 = db.IntegerProperty()
q34 = db.IntegerProperty()
q35 = db.IntegerProperty()
q41 = db.IntegerProperty()
q42 = db.IntegerProperty()
q43 = db.IntegerProperty()
q44 = db.IntegerProperty()
q45 = db.IntegerProperty()
q51 = db.IntegerProperty()
q52 = db.IntegerProperty()
q53 = db.IntegerProperty()
q54 = db.IntegerProperty()
q55 = db.IntegerProperty()
q61 = db.IntegerProperty()
q62 = db.IntegerProperty()
q63 = db.IntegerProperty()
q64 = db.IntegerProperty()
q65 = db.IntegerProperty()
q71 = db.IntegerProperty()
q72 = db.IntegerProperty()
q73 = db.IntegerProperty()
q74 = db.IntegerProperty()
q75 = db.IntegerProperty()
q81 = db.IntegerProperty()
q82 = db.IntegerProperty()
q83 = db.IntegerProperty()
q84 = db.IntegerProperty()
q85 = db.IntegerProperty()
q91 = db.IntegerProperty()
q92 = db.IntegerProperty()
q93 = db.IntegerProperty()
q94 = db.IntegerProperty()
q95 = db.IntegerProperty()
q101 = db.IntegerProperty()
q102 = db.IntegerProperty()
q103 = db.IntegerProperty()
q104 = db.IntegerProperty()
q105 = db.IntegerProperty()
q111 = db.IntegerProperty()
q112= db.IntegerProperty()
q113= db.IntegerProperty()
q114= db.IntegerProperty()
q115= db.IntegerProperty()
q121= db.IntegerProperty()
q122= db.IntegerProperty()
q123= db.IntegerProperty()
q124 = db.IntegerProperty()
q125 = db.IntegerProperty()
created = db.DateTimeProperty(auto_now_add = True)    

我想知道如果我想要获得特定列的添加(总和),我应该写什么查询???

如何计算数据库每列的总和?

3 个答案:

答案 0 :(得分:4)

如前所述,你根本就不能。

如何构建GAE数据存储区,甚至不考虑任何服务器端计算,它根本不会这样做。数据存储区的速度和可扩展性来自于它只对预先排序的表进行扫描(在写入时会丢失一点速度,但在读取时会获得难以置信的数量)。

因此,您可以选择为您的总数保留一个单独的实体,并在每次推送新数据时更新该实体(将“id = 1”作为您的总数,当您输入新数据时,您将获得id 1并执行+ =在每个属性上再次将id 1放入数据存储区之前),或使用mapreduce,如Daniel所述

答案 1 :(得分:3)

你不能。 GAE数据存储区不是关系数据库,您无法进行求和。

最好的办法是迭代并使用mapreduce framework计算总和。

答案 2 :(得分:1)

作为使用地图缩小的替代方法,您可以预先计算您关注的属性的总和。特别是,您可以使用sharded counter

这将让您有效地跟踪属性的总和,而无需运行任何作业来进行计算(除了初始地图缩小以填充现有数据的总和)。分片计数器的好处是,如果您正在编写需要更新计数器的许多实体,它可以扩展以防止争用。