2017-07-19 170 views

回答

3

如果特定查询的内存不足,BigQuery将不会丢弃数据;你会得到一个错误。你应该尽量保持你的行大小低于100MB,因为除此之外你会开始犯错。你可以尝试用这样一个例子创建一个大的字符串:

#standardSQL 
SELECT STRING_AGG(word) AS words FROM `bigquery-public-data.samples.shakespeare`; 

有164656行此表中,而这个查询(面积约为一兆字节)创建了1168286个字符的字符串。你会开始看到一个错误,如果你运行需要多一些百兆的顺序执行的单个节点上查询,但:

#standardSQL 
SELECT STRING_AGG(CONCAT(word, corpus)) AS words 
FROM `bigquery-public-data.samples.shakespeare` 
CROSS JOIN UNNEST(GENERATE_ARRAY(1, 1000)); 

这将导致一个错误:

Resources exceeded during query execution. 

如果您单击UI中的“说明”选项卡,则可以看到,在构建STRING_AGG的结果时,阶段1期间发生故障。在这种情况下,该字符串的长度将是3,303,599,000个字符,或者大小约为3.3 GB。

+0

有没有一种方法可以检查处理查询(任何报告或类似“解释”)时不同节点使用的数据量? – divyum

+0

您需要等待查询完成,然后查看“解释”选项卡,因为执行策略可能随着它的运行而改变。 –

+0

我检查了解释标签,它只给出了输入和输出行的数量,而不是节点数据统计。 – divyum

1

添加到艾略特的答案 - 如何解决:

这个查询(长尾)失败:

#standardSQL 
SELECT STRING_AGG(CONCAT(word, corpus)) AS words 
FROM `bigquery-public-data.samples.shakespeare` 
CROSS JOIN UNNEST(GENERATE_ARRAY(1, 1000)); 

但是你可以限制连接起来以获得一个有效的解决方案串的数量:

#standardSQL 
SELECT STRING_AGG(CONCAT(word, corpus) LIMIT 10) AS words 
FROM `bigquery-public-data.samples.shakespeare` 
CROSS JOIN UNNEST(GENERATE_ARRAY(1, 1000)); 
相关问题