firebase - 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 中安排前一天的每日更新的最佳做法是什么,这样我就不会错过几天?
解决方案
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)
...
推荐阅读
- sql - 在函数和过程中正确使用分号
- python - 如何组合多个等高线图?
- javascript - 使用插值标记拆分字符串
- swiftui - 使用 SwiftUI 在 WatchOS 中适配 UI
- excel - 如何在不选择的情况下将列从工作簿复制到工作簿?
- python - 如何使用 MouseMoveEvent 从 QColorDialog 更改颜色
- python - 为什么我的 Scraper 拉文本就好像我没有登录一样?
- django - 在 Django Celery 中使用来自 .env 的环境变量
- sql - 如果另一个表被更改,则更改一个表的方法
- mysql - 有没有办法确保对表架构的任何更改也适用于另一个表?