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

问题描述 投票:0回答:4

我正在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)    

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

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

python-2.7 google-app-engine google-cloud-datastore
4个回答
3
投票

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

最好的选择是使用 mapreduce 框架进行迭代并计算总和。


2
投票

正如之前所说,你根本做不到。

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

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

所提到的

1
投票

作为使用 MapReduce 的替代方法,您可以预先计算您关心的属性的总和。特别是,您可以使用分片计数器

这将使您能够有效地跟踪属性的总和,而无需运行任何作业来进行计算(除了初始映射减少以填充现有数据的总和)。分片计数器的优点是,如果您正在编写大量需要更新计数器的实体,它可以扩展以防止争用。


0
投票

数据存储中的 SUM 聚合现已普遍可用。

有多种语言的客户端库支持此特定功能。

通过聚合查询,用户可以避免执行客户端聚合,这会带来增加出口成本的额外负担。也不需要使用像cloud-functions这样的替代方案来更新后端的聚合值,这有其自身的成本限制。

© www.soinside.com 2019 - 2024. All rights reserved.