BigQuery 交叉联接失败
Posted
技术标签:
【中文标题】BigQuery 交叉联接失败【英文标题】:BigQuery Cross Join Failing 【发布时间】:2017-04-26 21:19:01 【问题描述】:我正在尝试按日期提取用户活动。自创建用户帐户以来,我正在尝试使用交叉联接和 where 子句来构建每天的表。就我而言,无法避免交叉连接。日历表只是过去 365 天(365 行)所有日期的列表。用户表有 ~1b 行。
这里是资源不足而失败的查询:
SELECT
u.user_id as user_id,
date(u.created) as signup_date,
cal.date as date,
from (select date(dt) as date from [dw.calendar] where date(dt) <
CURRENT_DATE() ) cal
cross join each dw.user u
where
date(u.created) <= cal.date
基于https://cloud.google.com/bigquery/query-reference,交叉连接甚至不支持“each”子句。如何执行以上操作才能成功建表?
【问题讨论】:
确切错误:查询失败错误:查询超出第 1 层的资源限制。需要第 6 层或更高。 使用standard SQL 可能会更好地工作,尽管即使在这种情况下,我怀疑您将需要启用更高的计费层级,因为交叉连接产生了多少行。 请解释一下——为什么首先需要它?这只是在没有交付任何价值的情况下爆炸行数!很可能您计划将其视为中间/临时表来处理它而不是 - 所以我建议您宁愿专注于最终目标而不是实现交叉产品的东西。除非——当然——你有充分的理由,所以解释一下 我需要通过按天、周、月、年汇总用户活动来找出答案。我将需要计算每日计数并执行窗口函数来获得总和。对于每一天,我都需要一个值,如果它缺失,则为 0。 SELECT id, daily_count, SUM(daily_count) OVER (PARTITION BY id ORDER BY d DESC rows BETWEEN current row AND 6 following ) week_avg from (select date(dt) as date from [dw.calendar] where date(dt) 那么,为什么不用你的真实目标/目标来更新你的问题呢?我认为它比当前的抽象和中间步骤更有意义,并且会吸引更多的答案:o) 【参考方案1】:您不需要填写“空”天来计算每日计数并执行窗口函数来获取聚合总和,因此您甚至不需要日历表。要做到这一点,您需要在窗口中使用 RANGE 与 ROWS。请参见下面的示例(适用于 BigQuery 标准 SQL)
#standardSQL
SELECT
user_id, created, daily_count,
SUM(daily_count) OVER(
PARTITION BY user_id ORDER BY created_unix_date DESC
RANGE BETWEEN CURRENT ROW AND 6 FOLLOWING
) weekly_avg
FROM `dw.user`, UNNEST([UNIX_DATE(created)]) AS created_unix_date
ORDER BY user_id, created DESC
我不确定您的表格的确切架构/类型,因此可能需要分别在上面进行调整,但同时您可以使用下面的虚拟数据进行测试/播放
#standardSQL
WITH `dw.user` AS (
SELECT
day AS created,
CAST(1 + 10 * RAND() AS INT64) AS user_id,
CAST(100 * RAND() AS INT64) AS daily_count
FROM UNNEST(GENERATE_DATE_ARRAY('2017-01-01', '2017-04-26')) AS day
)
SELECT
user_id, created, daily_count,
SUM(daily_count) OVER(
PARTITION BY user_id ORDER BY created_unix_date DESC
RANGE BETWEEN CURRENT ROW AND 6 FOLLOWING
) weekly_avg
FROM `dw.user`, UNNEST([UNIX_DATE(created)]) AS created_unix_date
ORDER BY user_id, created DESC
【讨论】:
以上是关于BigQuery 交叉联接失败的主要内容,如果未能解决你的问题,请参考以下文章