首页 > 解决方案 > BigQuery 中使用 Firebase 分析数据的每日计划

问题描述

因此,我使用“附加到表”首选项在 BigQuery 中创建了一个每日计划,因此它每天都会将昨天的数据添加到我指定的表中。我已安排在每天上午 9 点运行此查询,但问题是 Firebase 有时会在上午 9 点之后在 BigQuery 中创建前一天的数据表。

我将使用的每日计划 SELECT 示例是:

SELECT * FROM `analytics.events_*` WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))

从 Firebase 在 BigQuery 中安排前一天的每日更新的最佳做法是什么,这样我就不会错过几天?

标签: firebasegoogle-bigqueryfirebase-analytics

解决方案


Bigquery 计划设置为在固定时间运行。如果您的传入数据在交付时间上有所不同,那么 BigQuery 计划就不是您想要的。

但是,如果您坚持使用 BigQuery 计划,您可以放宽WHERE条件并在下次计划运行时捕获“缺失”的天数。然后你翻转了你的问题,而是需要处理不附加已经附加的行的情况(也增加了查询成本):

SELECT * 
FROM `analytics.events_*` 
LEFT JOIN [target dataset].[target table] AS T
USING (event_name, event_timestamp, user_pseudo_id)
WHERE T.event_name IS NULL
AND T.event_timestamp IS NULL
AND T.user_pseudo_id IS NULL
AND _TABLE_SUFFIX >= FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 2 DAY))

或者,您也可以将查询修改为INSERT插入记录并以类似方式处理重复的语句:

INSERT `[target dataset].[target table]`
SELECT *
FROM `analytics.events_*` 
LEFT JOIN `[target dataset].[target table]` AS T
USING (event_name, event_timestamp, user_pseudo_id)
WHERE _TABLE_SUFFIX >= FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 2 DAY))
AND T.event_name IS NULL
AND T.event_timestamp IS NULL
AND T.user_pseudo_id IS NULL

这样您就不需要为计划配置目标表。

WHERE此外,如果您的目标表是时间戳分区的,您可以通过添加一个严格限制为单个日期而不是整个表的附加条件来限制您在目标表中扫描的范围,从而减少扫描的数据量:

...
AND DATE(T.event_timestamp) = DATE_SUB(CURRENT_DATE(), INTERVAL 2)
...

推荐阅读