【问题标题】:Resources Exceeded in BigQueryBigQuery 中超出的资源
【发布时间】:2015-02-10 23:47:24
【问题描述】:

我不断超出以下查询的资源。我试过以批处理模式和命令行运行,但似乎没有任何效果。有人有想法吗?

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

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    这是一个看似昂贵的查询;在类似 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 行中拥有最少的标记。即使任何给定的extid 的行数少于 10 行,使用 MIN() 也可以进行这项工作。

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

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

    【讨论】:

    • 感谢您指出行子句。我仍然需要在外部查询中执行 row_number 以分析用户与事件交互的顺序,但它现在运行没有问题。另外,您能否从您的答案中编辑我的帐户信息。我不希望在公共论坛中列出完整的文件路径。
    • 仅供参考 Matthew 是一位有权访问查询日志的 BigQuery 工程师,以防您想知道他是如何找到您的项目 ID(并无意中将其添加到响应中)的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多