关于Google App Engine:避免和删除bigquery中的重复项

Avoiding and removing duplicates in bigquery

我们已经开始使用bigquery记录游戏中的事件。

我们从Appengine节点收集事件,然后将它们分块放入队列中,然后将其放入任务队列中。

然后,后端正在处理此队列,并将事件上载到bigquery。

今天,我们从一项游戏中每天存储大约6000万个事件,从另一个游戏中存储600万个事件。

我们还安排了cron工作来处理这些事件,以收集各种游戏KPI。 (即第二天的保留时间,活跃用户等)

一切都变得很顺利,但我们现在确实面临着一个棘手的问题!

========问题1 ======================================= ==========

由于某种原因,删除队列任务有时会失败。它不是很常见,但是经常发生并且经常爆发。

TransientFailureException可能是原因...我说可能是因为我们正在批处理模式下删除流程事件。 IE。 ...

1
List<Boolean> Queue.deleteTask(List<TashHandle> taskstoDelete)

...所以我们实际上不知道为什么我们无法删除任务。

我们今天添加了重试代码,该代码将尝试再次删除那些失败的删除操作。

是否有解决此类问题的最佳实践?

=========问题2 ===================================== ===================

重复检测

以下SQL成功地找到了或更小的游戏的副本,但超出了资源
大的。

1
2
3
4
5
6
7
8
SELECT DATE(ts) date, SUM(duplicates) - COUNT(duplicates) as duplicates
FROM (
  SELECT ts, eventId, userId, count(*) duplicates
  FROM [analytics_davincigameserver.events_app1_v2_201308]
  GROUP EACH BY ts, eventId, userId
  HAVING duplicates > 1
)
GROUP EACH BY date

即使对于我们更大的游戏,也有办法检测重复吗?
IE。一个查询,表明bigquery将能够处理我们每天的6000万行并查找重复项。

预先感谢!


第2个问题(我希望它们是单独的问题,以跳过此步骤和造成混乱的机会):

内部查询或外部查询是否用尽资源?

这项工作吗?

1
2
3
4
SELECT ts, eventId, userId, count(*) duplicates
FROM [analytics_davincigameserver.events_app1_v2_201308]
GROUP EACH BY ts, eventId, userId
HAVING duplicates > 1

如何减少基数?我猜是因为您要按时间戳分组,所以可能有太多不同的存储桶要分组。这样效果更好吗?

1
2
3
4
5
SELECT ts, eventId, userId, count(*) duplicates
FROM [analytics_davincigameserver.events_app1_v2_201308]
WHERE ABS(HASH(ts) % 10) = 1
GROUP EACH BY ts, eventId, userId
HAVING duplicates > 1