BigQuery:回填时如何在查询中使用 run_date

Posted

技术标签:

【中文标题】BigQuery:回填时如何在查询中使用 run_date【英文标题】:BigQuery: How to use run_date in the query when back-filling 【发布时间】:2019-05-19 14:43:07 【问题描述】:

我想从昨天的 firebase 分析事件表中获取数据,转换数据并使用与原始事件表相同的后缀更新现有分区表。 对于目标表,我可以使用模板:shares_run_time-24h|"%Y%m%d" 但在查询本身中,我能想到的只有:

WHERE
_TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))

这在手动运行时效果很好,但在我使用回填时显然会生成昨天的日期(而不是回填 run_date) 我尝试使用 @run_date w/ & w/o offset,但这不是一个有效的查询。

【问题讨论】:

【参考方案1】:

您应该能够将@run_date 作为参数传递给FORMAT_DATE

WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', @run_date)

这是因为@run_date 的类型为DATE,因此您可以在DATE 表达式有效的任何地方使用它。

【讨论】:

应该但是会产生错误:Undeclared query parameters【参考方案2】:
WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', @run_date)

其实这个方法是有效的。在处理这个问题时,我遇到了一些问题,比如@SagiLow 说的“未声明的查询参数”。这可能是因为 @run_date 无法操纵日期并在天之间进行操作。因此,虽然在查询构造函数中它不起作用,但在回填调度中它起作用,每天在确切的日期执行查询(不要忘记您不需要 INTERVAL,因为表已经存在)。

【讨论】:

【参考方案3】:

我已经将上面的答案标记为正确,但我只是想添加另一个有趣的用例作为该线程的一部分。我创建了以下查询以对每日活跃用户进行回填。然后可以将该查询用作 BQ 的“计划查询”。它包含@run_time-变量(而不是@run_date,但您也可以使用它)。注意:由于查询包含变量,因此您只能在 Scheduled Query 的视图中进行测试,而不能在 BigQuery 的 IDE 中进行测试。

目标表: daus_1dayactiveusers_BackFillTestrun_time|"%Y%m%d"

查询:

SELECT
  FORMAT_DATE('%Y%m%d', DATE(@run_time)) AS current_date,
  FORMAT_DATE('%Y%m%d', DATE_ADD(DATE(@run_time), INTERVAL - 3 DAY)) AS beg_date,
  FORMAT_DATE('%Y%m%d', DATE_ADD(DATE(@run_time), INTERVAL - 2 DAY)) AS end_date,
  TIMESTAMP_DIFF(TIMESTAMP(DATE_ADD(DATE(@run_time), INTERVAL - 2 DAY)), TIMESTAMP(DATE_ADD(DATE(@run_time), INTERVAL - 3 DAY)), HOUR) AS hours_diff,
  COUNT(DISTINCT user_pseudo_id) AS uniq_users
FROM
  `<>.analytics_12345679810.<>`
WHERE
  event_name = 'user_engagement'
  AND event_date >= FORMAT_DATE('%Y%m%d', DATE_ADD(DATE(@run_time), INTERVAL - 3 DAY))
  AND event_date < FORMAT_DATE('%Y%m%d', DATE_ADD(DATE(@run_time), INTERVAL - 2 DAY))
  AND platform = "android"

【讨论】:

以上是关于BigQuery:回填时如何在查询中使用 run_date的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 数据传输 - 数据回填与刷新

如何在 BigQuery 中手动强制报告运行?

你应该如何在 Rails 中回填新表?

如何回填 InfluxDB 中的连续查询?

从 Google Ads 到 BigQuery 的转移服务问题

Airflow BigQuery Hook - 通过 run_query 运行更新查询