使用 where 子句过滤大表中的数据返回“响应太大...”错误

Posted

技术标签:

【中文标题】使用 where 子句过滤大表中的数据返回“响应太大...”错误【英文标题】:Filtering data from large table using where clause returns 'response too large ...' error 【发布时间】:2014-03-19 12:59:06 【问题描述】:

我需要使用 'where' 子句从一个大小超过 1.2 TB 和大约 28 亿行的表中过滤一些数据。

我开始使用小型数据表(约 2100 万行和 9.6 个表大小)测试数据过滤,方法是设置目标表并在作业配置中启用“允许大结果”。

我的查询很简单:

SELECT * FROM [mydataset.mytable] Where DATETIME >= '2014-03-17 00:00:00' and  DATETIME <= '2014-03-17 23:59:59';

我同时使用了 BigQuery 浏览器工具和 bq 命令行工具,但是每次运行此查询时都会收到“响应太大而无法返回”错误。

在http://goo.gl/b6pNjA 的文档中,Google 说:

如果您计划运行可能返回较大结果的查询,您可以在作业配置中将 allowLargeResults 设置为 true。 您必须指定目标表。 您不能指定*** ORDER BY 子句。 窗口函数无法返回大查询结果。

我的查询很简单,不包含任何窗口函数。那么,要绕过这个问题,我可以使用特定的查询语法来成功运行我的查询吗?

请注意,在http://goo.gl/zkSN32 处,指定最大响应大小为 128 MB 压缩并且在返回大型查询结果时不受限制,如上述链接 (http://goo.gl/b6pNjA) 所述。

【问题讨论】:

我的意思是......它在你引用的那个文档中告诉你...... '如果你计划运行一个可能返回更大结果的查询,你可以将 allowLargeResults 设置为 true你的工作配置。' 在 BigQuery 浏览器工具中,我启用了“允许大结果”选项,并在 bq 命令行中做了同样的事情,但它总是返回“响应太大”错误。 我对系统不是很熟悉,但问题是否可能是显示结果而不是获取结果? IE。它声明你'你必须指定一个目标表',这意味着你必须将结果存储在某个地方,你不能只是将它打印出来或保存在内存中。 如果您在选择短语中声明所有字段而不是使用 * ,是否也会发生这种情况? 这听起来像是一个错误;您能否为其中一个失败的查询提供一个作业 ID,以便我们(BigQuery 团队)可以调查该问题? 【参考方案1】:

正如 N.N 所说,为避免在这种情况下出现“响应太大而无法返回”错误,它应该在 select 子句中声明所有字段,而不是使用 select *。

我尝试通过在 select 语句中声明所有字段、设置目标表并启用“允许大结果”来运行相同的查询,结果很好。

查询完成(经过 115.6 秒,已处理 298 GB)。

目标表的行数:77,796,259。

【讨论】:

以上是关于使用 where 子句过滤大表中的数据返回“响应太大...”错误的主要内容,如果未能解决你的问题,请参考以下文章

MySQL-过滤数据(WHERE语句)

MySQL基础:过滤数据

SQL之过滤数据(where子句)

需要 Where 子句中的属性 (Redshift)

《SQLite3 — 子句》

MySQL大表清空和删除正确方法