在Google BigQuery中加入2个大小相同的表格

时间:2012-07-31 00:06:57

标签: google-bigquery

我正在尝试加入2个表,每个表有57,191行。 BigQ正在寻找内部/左侧较大的桌子,右侧较小。当我用左边的表B运行它时,它的错误为'大表A必须首先出现'。当我切换查询并将表A放在From子句中时,它的错误为“大表B必须首先出现”。因此,当我按照指示行事时,它不会修复它,而是建议我的第一次(不正确的)尝试,除非我在某种程度上拙劣。

具有讽刺意味的是,如果2个表的大小相同,则根据大小决定一个大小,可能是一个不小于另一个。我试图找到一个解决方案,其中不包括我向其中一个表添加无意义的行,然后尝试在连接工作后删除它(因为BigQ现在没有加载我的单行csv文件,我相信它是由于我的错误。)

Google SQL语法联接规则似乎是

“join_type     Bigquery支持INNER(默认)和LEFT OUTER连接。 TABLE_2     这是连接中的第二个表,它必须很小,并且将连接到FROM子句中出现的表。请注意,这可以是表名或其他SELECT子句,在这种情况下,您必须提供别名。 join_condition_1,...,join_condition_N,...     连接条件集,必须是相等条件的集合,必须满足所有这些条件才能将行包含在结果中。 (也就是说,我们只支持用AND连接这些条件。)“

我正在运行的实际SQL是

SELECT lt.activeprosperloans,[fieldsredacted], ...
FROM prosperloans1.listings2 AS lt
JOIN prosperloans1.zjoinedperfloans as ln
ON lt.key = listingkey;

,实际错误如下: 错误:大表prosperloans1.zjoinedperfloans必须作为连接查询中最左边的表出现

由于 肖恩

2 个答案:

答案 0 :(得分:3)

请注意,现在您可以使用JOIN EACH,有效地解决问题。

您的查询将变为:

SELECT lt.activeprosperloans,[fieldsredacted], ...
FROM prosperloans1.listings2 AS lt
JOIN prosperloans1.zjoinedperfloans as ln
ON lt.key = listingkey;

来自文档:

如果可能,请使用不带EACH修饰符的JOIN以获得最佳性能。当表格大小对于JOIN来说太大时,请使用JOIN EACH。

https://developers.google.com/bigquery/docs/query-reference#joins

答案 1 :(得分:1)

由于回答了这个问题,BigQuery添加了JOIN EACH,这是一种连接两个大表的方法。有关如何使用JOIN EACH的说明,请参阅Fh的答案。

此回复的其余部分用于历史目的: 一个大表(用于连接)是超过7 MB的任何东西。为了进行连接,整个小表被发送到集群中的每个节点,因此我们对其进行了相当大的限制。可能是因为两个行的行数相同,一个表大于7 MB而另一个表较小。

减少其中一个表大小的一种方法是在查询中应用过滤器和列过滤器,并将结果另存为另一个临时表,然后将JOIN应用于临时表。例如。如果表中有10列跨越一个月的数据,但您只需要3列连接查询和最后一天的数据,您可以先选择三列和最近的数据,然后给结果命名。然后你可以对该表进行连接。