首页 文章

资源超限大查询

提问于
浏览
2
SELECT A,B, C, D, E, F ,EXTRACT(MONTH FROM PARSE_DATE('%b',Month)) 
as MonthNumber,PARSE_DATETIME(' %Y%b%d ', CONCAT(CAST(Year AS STRING),Month,'1'))  
as G FROM `XXX.YYY.ZZZ` 
where A !='null' and B = 'MYSTRING' order by A,Year

查询每次运行大约20 GB .

我的表ZZZ有396,567,431(3.96亿)行,大小为53 GB . 如果我在没有LIMIT子句的情况下执行上述查询,则会收到错误消息“资源超出” .

如果我用LIMIT子句执行它,那么对于更大的限制它会给出相同的错误 .

我正在使用运行上述查询的API编写python脚本,然后计算一些指标,然后将输出写入另一个表 . 它写了大约170万个输出行,所以基本上基于列A聚合第一个表,即原始表有多列用于列A.

现在我知道我们可以将允许大结果设置为on并选择输出表来解决此错误,但出于我的脚本的目的,它不能达到目的 .

此外,我读取顺序是导致这个的驱动部分,但下面是我的算法,我没有看到绕过顺序的方式 .

此外,我的脚本一次为查询结果分页100000行 .

log=[]
    while True:
        rows, total_rows, page_token = query_job.results.fetch_data(max_results=100000, page_token=page_token)
        for row in rows:
            try:
                lastAValue=log[-1][0]
            except IndexError:
                lastAValue=None

            if(lastAValue==None or row[0]==lastAValue):
                log.append(row)
            else:
                res=Compute(lastAValue,EntityType,lastAValue)
                allresults.append(res)
                log=[]
                log.append(row)
        if not page_token:
            break

我有两个问题:

列A | B栏......

123 | NDG

123 | KOE

123 | TR

345 | POP

345 | KOP

345 | POL

我保持逻辑的方式是:遍历行并检查列A是否与最后一行A相同 . 如果相同,则将该行添加到数组中 . 当我遇到不同的列A,即345时,我发送第一组A列进行处理,计算并将数据添加到我的阵列 . 基于这种方法,我有一些问题:

1)我实际上只有一次查询 . 所以,我应该只收取1个查询 . 根据totalRows / noOf页面收取大查询费用吗?即上述代码中的单个页面是否单独查询并单独收费?

2)假设上面例子中的页面大小为5,那么345个条目将跨页面分布,在这种情况下,我会丢失有关第6个345 -POL条目的信息,因为它将在不同的页面中?有没有解决这个问题?

3)如果它们的值不同,是否有直接的方法绕过整个检查连续的行?像直接组by和get组作为数组机制?如果我增加100万的限制,上面的方法需要花费几个小时(估计) .

4)如何通过指定超过100万的上限来解决资源超出的错误 .

1 回答

  • 0

    您要求BigQuery生成一个巨大的排序结果,BigQuery目前无法有效并行化,因此您会收到“资源超出”错误 .

    执行此类查询的有效方法是允许您的计算在BigQuery内部的SQL中进行,而不是从中提取大量结果,并在Python中进行后处理 . 如果Compute()函数可以用SQL表示,那么分析函数是执行所描述的常用方法 .

    例如 . 为了在A更改之前找到最后一行中B的值,您可以使用LAST_VALUE函数找到此行,例如

    select LAST_VALUE(B) OVER(PARTITION BY A ORDER BY Yeah) from ...
    

    如果您可以描述Compute()的作用,我们可以尝试填充细节 .

相关问题