避免和删除bigquery中的重复项

时间:2013-09-13 13:22:31

标签: google-app-engine google-bigquery

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

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

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

今天我们在其中一个游戏中存储了大约6千万个日常活动,而在另一个游戏中存储了600万个。

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

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

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

由于某种原因,删除队列任务时不时失败。不是经常发生,而是经常爆发。

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

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

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

我们今天添加了重试代码,尝试再次删除这些失败的删除。

是否有最佳方法来处理此类问题?

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

重复检测

以下SQL成功找到重复或更小的游戏,但超出了资源 更大的一个。

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

有没有办法检测重复项,即使对于我们更大的游戏? 即一个查询,bigquery将能够破坏我们每天6000万行并找到重复的行。

提前致谢!

1 个答案:

答案 0 :(得分:1)

对于问题#2(我更喜欢他们是单独的问题,跳过这一步和混淆的机会):

内部查询或外部查询?

上的资源已用完

这有用吗?

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

降低基数怎么样?我猜你正在按时间戳分组,可能有太多不同的桶要分组。这会更好吗?

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