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个阶段。它不会 运行 快,但从不需要在一个位置存储大量数据。希望对您有所帮助!
我不断获取超出以下查询的资源。我已经在批处理模式和命令行中尝试了 运行,但似乎没有任何效果。有人有想法吗?
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
.
中间的子select为每个extid
寻找最大的tenth_stamp
。这是 extid
的第 10 个总邮票。然后,外部 SELECT 可以将结果限制为只有在最近十个 stamp
中具有 stamp
的行,它们各自的 extid
,从而为您提供所需的结果。
执行时,总共需要4个阶段。它不会 运行 快,但从不需要在一个位置存储大量数据。希望对您有所帮助!