使用Firebase analytics数据的BigQuery中的每日计划

使用Firebase analytics数据的BigQuery中的每日计划,firebase,google-bigquery,firebase-analytics,Firebase,Google Bigquery,Firebase Analytics,因此,我在BigQuery中使用“附加到表”首选项创建了一个每日计划,因此每天它都会将昨天的数据添加到我指定的表中。我计划每天上午9点运行此查询,但问题是Firebase有时会在上午9点之后在BigQuery中创建前一天的数据表 我将使用的每日计划选择示例是: SELECT * FROM `analytics.events_*` WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))

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

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

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

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

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

但是,如果您坚持使用BigQuery时间表,您可以放松
WHERE
条件,并在下次运行时间表时捕获“缺失”的天数。然后,您将问题翻转过来,需要处理未追加已追加行的情况(也会增加查询成本):

或者,也可以将查询修改为
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
这样就不需要为计划配置目标表

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

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