Sql BigQuery:如何避免“查询执行期间超出资源”。错误

Sql BigQuery:如何避免“查询执行期间超出资源”。错误,sql,google-bigquery,Sql,Google Bigquery,我想知道如何避免在执行错误期间超出资源。关于这一点的大多数其他问题都涉及到加入每个人或每个人分组,但我已经没有使用这些问题了。如果我在日期或ABSHASHuserId上包含WHERE子句,那么查询可以工作,但我希望整个数据集都可用,然后我将在Tableau中进一步过滤它 如果我删除t4,查询将正常工作,但我需要最后一列,并且我将需要从event_parameters字段中创建更多的列,以供以后的查询使用 作业ID为rhi localytics db:job6maesvumk6mp6irmanrc

我想知道如何避免在执行错误期间超出资源。关于这一点的大多数其他问题都涉及到加入每个人或每个人分组,但我已经没有使用这些问题了。如果我在日期或ABSHASHuserId上包含WHERE子句,那么查询可以工作,但我希望整个数据集都可用,然后我将在Tableau中进一步过滤它

如果我删除t4,查询将正常工作,但我需要最后一列,并且我将需要从event_parameters字段中创建更多的列,以供以后的查询使用

作业ID为rhi localytics db:job6maesvumk6mp6irmanrcm9r3cx8,以防有帮助,谢谢

SELECT
    t1.userId as userId,
    t1.event_time AS event_time,
    t1.Diamond_Balance as Diamond_Balance,
    t2.Diamond_Change as Diamond_Change,
    t3.Gold_Balance as Gold_Balance,
    t4.Gold_Change as Gold_Change
FROM (
    SELECT
        userId,
        event_time,
        INTEGER(event_parameters.Value) AS Diamond_Balance,
    FROM
        FLATTEN([game_data], event_parameters)
    WHERE
        event_name LIKE 'Currency'
        AND event_parameters.Name = 'Diamond_Balance'
        -- and date(event_time) > '2015-09-11'
        -- AND ABS(HASH(userId) % 5)  = 0
    GROUP BY
        userId,
        event_time,
        Diamond_Balance ) AS t1
INNER JOIN (
    SELECT
        userId,
        event_time,
        INTEGER(event_parameters.Value) AS Diamond_Change,
    FROM
        FLATTEN([game_data], event_parameters)
    WHERE
        event_name LIKE 'Currency'
        AND event_parameters.Name = 'Diamond_Change'
        AND INTEGER(event_parameters.Value ) < 14000
        AND INTEGER(event_parameters.Value ) > -14000
        -- and date(event_time) > '2015-09-11'
        -- AND ABS(HASH(userId) % 5)  = 0

    GROUP BY
        userId,
        event_time,
        Diamond_Change ) AS t2
ON
    t1.userId = t2.userId
    AND t1.event_time = t2.event_time
INNER JOIN (
    SELECT
        userId,
        event_time,
        event_parameters.Value AS Gold_Balance,
    FROM
        FLATTEN([game_data], event_parameters)
    WHERE
        event_name LIKE 'Currency'
        AND event_parameters.Name = 'Gold_Balance'
        -- and date(event_time) > '2015-09-11'
        -- AND ABS(HASH(userId) % 5)  = 0

    GROUP BY
        userId,
        event_time,
        Gold_Balance ) AS t3
ON
    t1.userId = t3.userId
    AND t1.event_time = t3.event_time
INNER JOIN (
    SELECT
        userId,
        event_time,
        INTEGER(event_parameters.Value) AS Gold_Change,
    FROM
        FLATTEN([game_data], event_parameters)
    WHERE
        event_name LIKE 'Currency'
        AND event_parameters.Name = 'Gold_Change'
        -- and date(event_time) > '2015-09-11'
        -- AND ABS(HASH(userId) % 5)  = 0
    GROUP BY
        userId,
        event_time,
        Gold_Change ) AS t4
ON
    t1.userId = t4.userId
    AND t1.event_time = t4.event_time

我认为你应该能够在一次简单的扫描中完成你所有的逻辑。 根本没有加入! 像下面这样。只是一个想法-但有一些机会按原样工作:

SELECT
    userId,
    event_time,
    MAX(CASE WHEN event_parameters.Name = 'Diamond_Balance' 
            THEN INTEGER(event_parameters.Value) END) AS Diamond_Balance,
    MAX(CASE WHEN event_parameters.Name = 'Diamond_Change' AND INTEGER(event_parameters.Value ) BETWEEN -14000 AND 14000 
            THEN INTEGER(event_parameters.Value)) END AS Diamond_Change,
    MAX(CASE WHEN event_parameters.Name = 'Gold_Balance' 
            THEN INTEGER(event_parameters.Value) END) AS Gold_Balance,
    MAX(CASE WHEN event_parameters.Name = 'Gold_Change' 
            THEN INTEGER(event_parameters.Value) END) AS Gold_Change
FROM
    FLATTEN([game_data], event_parameters)
WHERE
    event_name LIKE 'Currency'
GROUP BY
    userId,
    event_time

有关超出资源的一般建议,请参见:

请注意,添加每个都通常是资源超出错误的解决方案,而不是原因。虽然在某些情况下,它可以反过来工作


此外,每个问题在分组时都不再有意义,在加入时很快就会变得无关紧要。

谢谢,我已经读过这个问题,但我肯定没有注意到每个问题都是问题的解决方案。添加JOIN-EACH使查询工作起来。感谢Mikhail,这也起了作用,是一个更简单的解决方案。我不确定它对于字符串而不是整数的事件参数将如何工作。只需删除整数即可