【问题标题】:Resources exceed limits big query资源超出限制 bigquery
【发布时间】:2017-06-20 15:06:35
【问题描述】:
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 列有多行。

现在我知道我们可以将允许大结果设置为打开并选择一个输出表来解决此错误,但就我的脚本而言,它并没有达到目的。

另外,我读到 order by 是导致这种情况的昂贵部分,但下面是我的算法,我没有看到 order by 的方法。

另外,我的脚本一次分页查询结果 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 |回复

345 |流行音乐

345 |韩流

345 |波尔

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

1) 我实际上只查询了一次。所以,我应该只为 1 次查询付费。大查询是否按 totalRows/noOf pages 收费?即上述代码中的各个页面是否会单独查询并单独收费?

2) 假设上例中的页面大小为 5,会发生什么情况是 345 个条目将分布在多个页面中,在这种情况下,我将丢失有关第 6 个 345 -POL 条目的信息,因为它将位于不同的页面?有解决办法吗?

3)如果它们的值不同,是否有直接的方法来绕过整个检查连续行?像直接 group by 和 get groups 作为数组机制?如果我添加 100 万个限制,上述方法需要几个小时(估计)才能运行。

4) 我怎样才能通过指定高于 100 万的限制来解决资源超出这个错误。?

【问题讨论】:

  • 为什么不直接分组,让 bigquery 进行聚合?
  • 我收到此错误:SELECT 列表表达式引用的列 (B,C,D) 既不分组也不聚合
  • 您介意在原帖中分享该查询吗?

标签: python sql google-bigquery google-cloud-platform


【解决方案1】:

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

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

例如要在 A 更改之前在最后一行中查找 B 的值,您可以使用 LAST_VALUE 函数找到该行,类似于

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

如果您可以描述 Compute() 的作用,我们可以尝试填写详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    相关资源
    最近更新 更多