【问题标题】:Joining 2 equally sized tables in Google BigQuery在 Google BigQuery 中加入 2 个大小相同的表
【发布时间】:2012-07-28 16:56:49
【问题描述】:

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

有点讽刺的是,如果两张桌子大小相同,它会根据一张不小于另一张来决定一张更大。我正在尝试找到一个解决方案,其中不包括向其中一个表添加无意义的行,然后在连接工作后尝试将其删除,(因为 BigQ 现在没有加载我的单行 csv 文件,我确信它是由于我的错误。)

Google SQL 语法连接规则似乎是

“加入类型 Bigquery 支持 INNER(默认)和 LEFT OUTER 连接。 表_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 必须作为连接查询中最左边的表出现

谢谢 肖恩

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    请注意,现在您可以使用 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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 不用担心。由于它不是真正的“大数据”,我可以将其导入 Excel 或 Google Docs 排序并合并它,所以现在就这样做。
      猜你喜欢
      • 1970-01-01
      • 2020-03-01
      • 2021-08-12
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多