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 回答
您要求BigQuery生成一个巨大的排序结果,BigQuery目前无法有效并行化,因此您会收到“资源超出”错误 .
执行此类查询的有效方法是允许您的计算在BigQuery内部的SQL中进行,而不是从中提取大量结果,并在Python中进行后处理 . 如果Compute()函数可以用SQL表示,那么分析函数是执行所描述的常用方法 .
例如 . 为了在A更改之前找到最后一行中B的值,您可以使用LAST_VALUE函数找到此行,例如
如果您可以描述Compute()的作用,我们可以尝试填充细节 .