BigQuery 中的资源超出限制

Resources Exceeded in 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

这是一个看似昂贵的查询;在类似 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

最里面的子 select 提取您的数据和一个字段 tenth_stamp,该字段 tenth_stamp 包含所检查的 10 行中最少的标记。使用 MIN() 即使对于任何给定 extid.

的行数少于 10 行,也可以使此工作正常进行

中间的子select为每个extid寻找最大的tenth_stamp。这是 extid 的第 10 个总邮票。然后,外部 SELECT 可以将结果限制为只有在最近十个 stamp 中具有 stamp 的行,它们各自的 extid,从而为您提供所需的结果。

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