BigQuery:回填时如何在查询中使用run_date
BigQuery: How to use run_date in the query when back-filling
我想从昨天的 firebase 分析事件 table 中获取数据,转换数据并更新现有分区 table,其后缀与原始事件 table 相同。
对于目的地 table,我可以使用模板: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 偏移量,但它不是有效的查询。
您应该能够将 @run_date
作为参数传递给 FORMAT_DATE
:
WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', @run_date)
这是可行的,因为 @run_date
的类型是 DATE
,因此您可以在 DATE
表达式有效的任何地方使用它。
WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', @run_date)
其实这个方法很管用。为此,我遇到了一些问题,如@SagiLow 所说,'Undeclared query parameters'。可能是因为@run_date 不能操作日期和日期之间的操作。因此,虽然在查询构造函数中它不起作用,但在回填调度中它起作用,每天在确切的日期执行查询(不要忘记你不需要 INTERVAL 因为表已经存在)。
我已经将上面的答案标记为正确,但我只想添加另一个有趣的用例作为该线程的一部分。我创建了以下查询以对 每日活跃用户 进行回填。然后可以将该查询用作 BQ 的“计划查询”。它包含 @run_time
变量(而不是 @run_date
,但您也可以使用它)。注意:由于查询包含一个变量,您只能在计划查询的视图中测试它,而不能在 BigQuery 的 IDE.
中进行测试
目的地table:
daus_1dayactiveusers_BackFillTest{run_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"
我想从昨天的 firebase 分析事件 table 中获取数据,转换数据并更新现有分区 table,其后缀与原始事件 table 相同。
对于目的地 table,我可以使用模板: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 偏移量,但它不是有效的查询。
您应该能够将 @run_date
作为参数传递给 FORMAT_DATE
:
WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', @run_date)
这是可行的,因为 @run_date
的类型是 DATE
,因此您可以在 DATE
表达式有效的任何地方使用它。
WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', @run_date)
其实这个方法很管用。为此,我遇到了一些问题,如@SagiLow 所说,'Undeclared query parameters'。可能是因为@run_date 不能操作日期和日期之间的操作。因此,虽然在查询构造函数中它不起作用,但在回填调度中它起作用,每天在确切的日期执行查询(不要忘记你不需要 INTERVAL 因为表已经存在)。
我已经将上面的答案标记为正确,但我只想添加另一个有趣的用例作为该线程的一部分。我创建了以下查询以对 每日活跃用户 进行回填。然后可以将该查询用作 BQ 的“计划查询”。它包含 @run_time
变量(而不是 @run_date
,但您也可以使用它)。注意:由于查询包含一个变量,您只能在计划查询的视图中测试它,而不能在 BigQuery 的 IDE.
目的地table:
daus_1dayactiveusers_BackFillTest{run_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"