更新(2016-03-16):对于大多数查询,不再需要EACH,实际上可能会增加查看此错误的可能性.如果从查询中的每个JOIN和GROUP BY中省略EACH关键字,查询引擎现在将动态优化您的查询以消除此错误.
仍有一些极端情况,指定EACH关键字可以使查询运行(或运行得更快),但一般来说,BigQuery团队建议您在没有EACH的情况下尝试查询.很快,EACH关键字将成为一个完整的无操作.
原始答案:当您在JOIN EACH或GROUP EACH BY中使用EACH关键字时,或者当您使用PARTITION BY子句时,BigQuery会根据连接键或组键对您的数据进行分区("随机播放"), worker任务在本地执行其部分连接或聚合.
当一个这样的工作程序获取太多数据并超过其限制时,会发生资源超出错误.一般来说,此错误的原因分为两类:
偏斜:数据严重偏向一个键值(例如,"访客"用户ID或空键),这意味着一个工作人员获取该密钥的所有记录并且过载.
数据大小和工作人员数量不匹配:BigQuery为您的查询分配的工作人员数量太多.
我们正在进行一些改进,以帮助我们应对这两种情况,这样您就不必担心这些问题.但是,现在,您可以使用以下方法之一解决此问题:
过滤掉倾斜的键.如果您的数据偏差是因为一半的连接键值实际上为空,您可以通过WHERE key IS NOT NULL
在连接之前添加来过滤掉这些数据.
减少处理的数据量.过滤与加入的每一侧WHERE ABS(HASH(key)) % 5 == 0
应用加入到唯一的数据(或任何部分你想要的)的1/5,然后做同样的== 1
,== 2
,== 3
,== 4
在单独的查询.您手动将数据分成较小的块以使查询通过 - 但请注意,您需要支付5倍的费用,因为您查询了相同的数据5次.
重新审视您的查询.也许您可以以完全不同的方式构建查询,或者计算一些中间结果,以获得您想要的答案.
归档时间: |
|
查看次数: |
1053 次 |
最近记录: |