首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bigquery洗牌错误失败

Bigquery洗牌错误失败
EN

Stack Overflow用户
提问于 2014-04-22 23:22:47
回答 2查看 465关注 0票数 1

我有以下问题:

代码语言:javascript
复制
SELECT 
ducc.*, dl.LOCATIONID, dl.LOCATIONNAME
FROM [table1] ducc
LEFT OUTER JOIN EACH [table2] dl
ON ducc.LOCATIONID = dl.LOCATIONID
WHERE ABS(ducc.LOCATIONID % 30) = 0

它给了我“混乱失败的错误:一次洗牌不能超过3.00T。这个查询中的一个洗牌分区超过了7.68G。解决这个错误的策略可以在go/dremelfaq上使用。”

我假设它不能正确地排序和洗牌,因为我从table2获得了两列,因为置换的复杂性很高。

有这方面的工作吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-23 18:59:29

谢谢乔丹的洞察力

我想案件2是问题的原因。

“连接键的分布非常不平衡。也就是说,如果一个LOCATIONID占table1中行的很大一部分。有时这可能是预期的。有时是因为默认值。例如,如果table1有很多不知道LOCATIONID的行,那么按照约定,使用0就意味着许多数据会被散列到相同的位置。”

表1.LOCATIONID中的大多数值为NULL。所以,尽管我有所有的表2.是唯一的,但它失败了。

一旦我加入了包含table1和table2中99%不同值的列,它就像一种魅力。

票数 1
EN

Stack Overflow用户

发布于 2014-04-23 15:29:18

有几种可能性:

  1. 加入爆炸。table2中的位置in是唯一的吗?如果不是,您可以创建一个NxM扩展,其中table1中的所有N个匹配字段与所有M匹配字段和table2匹配,并在输出中创建比在输入中更多的行。
  2. 连接键的分布非常不平衡。也就是说,如果一个LOCATIONID在table1中占了很大一部分行。有时这是意料之中的事。有时,这是因为默认值。例如,如果table1有许多不知道LOCATIONID的行,那么按照约定使用0,这意味着许多数据被散列到同一个位置。
  3. 这也是有可能的,这是什么东西,应该只是工作。如果您提供了一个失败作业的作业id,BigQuery的一名工程师可以查找这个问题,看看出了什么问题。

注意,对于这些问题,您正在进行的分区(ABS(ducc.LOCATIONID % 30 = 0) )并不一定有帮助,因为满足这些要求的值都将被散列到相同的位置。

你有几件事可以尝试:

  1. 如果您有一个联接爆炸,您可以在连接右侧的一个子选择中对每个组进行分组,这样您就只能得到不同的值。例如: 从dl.LOCATIONID .*,table1中选择table1左外连接(选择LOCATIONID,MIN( LOCATIONNAME )作为LOCATIONNAME,从table2组中选择ducc.LOCATIONID = dl.LOCATIONID (ducc.LOCATIONID% 30) =0
  2. 删除每个限定符。这意味着你不必做洗牌。这只有在table2足够小的情况下才能起作用。但是,您可以将筛选应用于该表,这可能会有所帮助,如下所示: 选择ducc.*,dl.LOCATIONID,dl.LOCATIONNAME从table1左侧连接(从table2选择LOCATIONID,LOCATIONNAME,其中ABS(ducc.LOCATIONID % 30) = 0) dl ON ducc.LOCATIONID = dl.LOCATIONID
  3. 如果问题是您的散列桶太大,因为有一个虚拟值被匹配,那么您当然可以尝试将其过滤掉。如果它是一个合法值,有很大比例的匹配,您可以将查询分解成几个部分,首先将“太多匹配”作为连接,而不是每个连接,而其他部分则作为单独的查询进行连接。通过指定要将第一个查询的结果附加到第二个查询,可以将结果连接在一起。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23232062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档