BigQuery中超出了资源

时间:2015-02-10 23:47:24

标签: google-bigquery

我继续为以下查询获取资源。我试过在批处理模式和命令行中运行,似乎没有任何工作。有人有想法吗?

SELECT num, extid, amount, note, balance FROM ( SELECT row_number() over(partition by extid order by stamp) as num , extid, stamp, ds, amount, note, balance FROM monte.ledger2_trailing_21d WHERE ds >= '2015-02-09' ORDER BY extid, stamp ) WHERE num <= 10 limit 300

1 个答案:

答案 0 :(得分:4)

这是一个看似昂贵的查询;在类似SQL的环境中,时间序列分析总是很难。您编写的PARTITION BY子句要求单个计算机的内存中存在单个 extid 的所有数据,这会使其超载并导致资源超出错误。

您可以通过使用ROWS子句来限制分区范围来缓解此RAM要求。这是一个例子:

SELECT extid, stamp, ds, amount, note, balance
FROM (
  SELECT
    extid, stamp, ds, amount, note, balance,
    MAX(tenth_stamp) OVER(PARTITION BY extid) AS target_stamp
  FROM (
    SELECT extid, stamp, ds, amount, note, balance,
      MIN(stamp) OVER (
        PARTITION BY extid
        ORDER BY stamp DESC
        ROWS BETWEEN CURRENT ROW AND 9 FOLLOWING
      ) AS tenth_stamp
    FROM
      [monte.ledger2_trailing_21d]
    WHERE ds >= '2015-02-09'
  )
)
WHERE stamp >= target_stamp
ORDER BY extid, stamp
LIMIT 300

最内部的子选择提取您的数据和一个字段tenth_stamp,该字段保存所检查的10行中的最小标记。即使任何给定MIN()的行数少于10行,使用extid也可以正常工作。

中间子选择查找每个tenth_stamp的最大extid。这是extid的第十个总标记。然后,外部SELECT可以将结果限制为只有stamp的行,这些行在stamp的最新extid内,为您提供所需的结果。

执行时,总共需要4个阶段。它不会快速运行,但不会在一个位置需要大量数据。希望有所帮助!