gpt4 book ai didi

python - 在 Google App Engine 上获取 DISTINCT 用户

转载 作者:太空狗 更新时间:2023-10-30 02:23:44 26 4
gpt4 key购买 nike

如何在 Google App Engine (Python) 上执行此操作:

SELECT COUNT(DISTINCT user) FROM event WHERE event_type = "PAGEVIEW" 
AND t >= start_time AND t <= end_time

长版:

我有一个 Python Google App Engine 应用程序,其中包含生成事件(例如网页浏览)的用户。我想知道在给定的时间跨度内有多少唯一用户生成了网页浏览事件。我最感兴趣的时间跨度是一周,一周内大约有 100 万个此类事件。我想在 cron 作业中运行它。

我的事件实体如下所示:

class Event(db.Model):
t = db.DateTimeProperty(auto_now_add=True)
user = db.StringProperty(required=True)
event_type = db.StringProperty(required=True)

使用 SQL 数据库,我会做类似的事情

SELECT COUNT(DISTINCT user) FROM event WHERE event_type = "PAGEVIEW" 
AND t >= start_time AND t <= end_time

首先想到的是获取所有 PAGEVIEW 事件并过滤掉重复的用户。像这样的东西:

query = Event.all()
query.filter("t >=", start_time)
query.filter("t <=", end_time)
usernames = []
for event in query:
usernames.append(event.user)
answer = len(set(usernames))

但这行不通,因为它最多只能支持 1000 个事件。我想到的下一件事是获得 1000 个事件,然后当这些事件用完时获得下一个,依此类推。但这也行不通,因为通过一千个查询并检索一百万个实体将花费超过 30 秒,这是请求时间限制。

然后我想我应该按用户排序以更快地跳过重复项。但这是不允许的,因为我已经在使用不等式“t >= start_time AND t <= end_time”。

很明显这不可能在 30 秒内完成,因此需要对其进行分段。但是寻找不同的项目似乎并没有很好地分成子任务。我能想到的最好的办法是在每个 cron jobcall 上找到 1000 个页面浏览事件,然后从中获取不同的用户名,并将它们放在像 Chard 这样的实体中。它可能看起来像

class Chard(db.Model):
usernames = db.StringListProperty(required=True)

因此,每个 chard 最多可包含 1000 个用户名,如果删除了重复项,则更少。大约 16 小时后(这很好),我将拥有所有的甜菜并可以做类似的事情:

chards = Chard.all()
all_usernames = set()
for chard in chards:
all_usernames = all_usernames.union(chard.usernames)
answer = len(all_usernames)

这似乎可行,但不是一个完美的解决方案。如果有足够多的独特用户,这个循环可能会花费很长时间。我还没有测试过它,希望有人能提出更好的建议,所以如果这个循环足够快的话就不要测试了。

我的问题有更好的解决方案吗?

当然,所有这些独特的用户计数都可以使用 Google Analytics 轻松完成,但我正在构建应用程序特定指标的仪表板,并打算将其作为众多统计数据中的第一个。

最佳答案

从 SDK v1.7.4 开始,现在有对 DISTINCT 函数的实验性支持。

参见:https://developers.google.com/appengine/docs/python/datastore/gqlreference

关于python - 在 Google App Engine 上获取 DISTINCT 用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2162409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com