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 交叉联接失败的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery 更新与内部联接

联接表结果 Google BigQuery

BigQuery 中的联接性能缓慢

BigQuery:使用子查询和内部联接的计数更新行

BigQuery 无法识别联接中子选择的字段

如何使用 Apache BEAM 在 BigQuery 中执行快速联接