什么导致BigQuery中的"资源超出"?

Jer*_*dit 6 google-bigquery

我的查询失败,错误"资源超出".导致此错误的原因是什么,我该如何解决?

Jer*_*dit 7

更新(2016-03-16):对于大多数查询,不再需要EACH,实际上可能会增加查看此错误的可能性.如果从查询中的每个JOIN和GROUP BY中省略EACH关键字,查询引擎现在将动态优化您的查询以消除此错误.

仍有一些极端情况,指定EACH关键字可以使查询运行(或运行得更快),但一般来说,BigQuery团队建议您在没有EACH的情况下尝试查询.很快,EACH关键字将成为一个完整的无操作.


原始答案:当您在JOIN EACH或GROUP EACH BY中使用EACH关键字时,或者当您使用PARTITION BY子句时,BigQuery会根据连接键或组键对您的数据进行分区("随机播放"), worker任务在本地执行其部分连接或聚合.

当一个这样的工作程序获取太多数据并超过其限制时,会发生资源超出错误.一般来说,此错误的原因分为两类:

  1. 偏斜:数据严重偏向一个键值(例如,"访客"用户ID或空键),这意味着一个工作人员获取该密钥的所有记录并且过载.

  2. 数据大小和工作人员数量不匹配:BigQuery为您的查询分配的工作人员数量太多.

我们正在进行一些改进,以帮助我们应对这两种情况,这样您就不必担心这些问题.但是,现在,您可以使用以下方法之一解决此问题:

  1. 过滤掉倾斜的键.如果您的数据偏差是因为一半的连接键值实际上为空,您可以通过WHERE key IS NOT NULL在连接之前添加来过滤掉这些数据.

  2. 减少处理的数据量.过滤与加入的每一侧WHERE ABS(HASH(key)) % 5 == 0应用加入到唯一的数据(或任何部分你想要的)的1/5,然后做同样的== 1,== 2,== 3,== 4在单独的查询.您手动将数据分成较小的块以使查询通过 - 但请注意,您需要支付5倍的费用,因为您查询了相同的数据5次.

  3. 重新审视您的查询.也许您可以以完全不同的方式构建查询,或者计算一些中间结果,以获得您想要的答案.