【问题标题】:Filtering data from large table using where clause returns 'response too large ...' error使用 where 子句过滤大表中的数据返回“响应太大...”错误
【发布时间】: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 团队)可以调查该问题?

标签: sql google-bigquery


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 2015-05-27
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多