加入 Google Bigquery

Posted

技术标签:

【中文标题】加入 Google Bigquery【英文标题】:Joins on Google Bigquery 【发布时间】:2012-11-20 08:09:50 【问题描述】:

我知道正在努力改进 Bigquery 上的 Join 功能,而不是在这里咆哮,但如果无法正确使用 Join,将很难将“Terabyte”数据集分析为“广告”。

好的,回到问题,我有两张表,一张是 600 Megs,另一张是 50Megs,我确实尝试进行连接,但我得到了一个关于必须留下更小的表的错误。我做了一些研究,发现Bigquery 认为这两个表都大于 7MB?

因此,根据我在网上找到的一些建议,我确实选择了较小表的相关数据集并将其保存在一个新表中,新数据集是 12MB 和两列 600K 行。然后我再次尝试了我的查询,但我仍然收到同样的错误:

Query Failed : Error: Large table cdrs_test.geoIP_Left must appear as the leftmost table in a join query

geoIP_Left 是 12 Megs,另一个表是 600Megs..

这可以以某种方式解决还是我被破坏了?如果有人知道我可以用来分析支持联接的大数据集的任何其他服务吗?

编辑:这是实际的查询;

SELECT COUNT(results.cc_card) AS count,
       sum(results.sessiontime) AS time, 
       geoIP_Left.place AS place 
FROM cdrs_test.cdrs_2010_5 AS results 
JOIN cdrs_test.geoIP_Left AS geoIP_table 
  ON results.cc_card = geoIP_table.vcard 
WHERE results.sessiontime > 0 AND results.countryName Contains 'India' 
GROUP BY place;

【问题讨论】:

你能显示你的实际查询吗? SELECT COUNT(results.cc_card) AS count,sum(results.sessiontime) AS time, geoIP_Left.place AS place FROM cdrs_test.cdrs_2010_5 AS 结果 JOIN cdrs_test.geoIP_Left AS geoIP_table ON results.cc_card = geoIP_table .vcard WHERE results.sessiontime > 0 AND results.countryName 包含 'India' GROUP BY place; 将查询添加到问题中以提高可读性。 【参考方案1】:

您可以将此查询表示为仅引用来自cdrs_test.geoIP_Left 中您感兴趣的列的子选择。参见第二个示例here。

SELECT
  COUNT(results.cc_card) AS count,
  sum(results.sessiontime) AS time, 
  geoIP_table.place AS place 
FROM
  cdrs_test.cdrs_2010_5 AS results 
JOIN
  (SELECT place, vcard FROM cdrs_test.geoIP_Left)
AS
  geoIP_table 
ON
  results.cc_card = geoIP_table.vcard 
WHERE
  results.sessiontime > 0 AND results.countryName CONTAINS 'India' 
GROUP BY
  place;

您也可以简单地运行多个查询 - 请注意,您可以将查询结果显式保存为命名表,并在以后的查询中使用该表。

最后,另一种选择是预先加入数据,使用(例如)MapReduce 转换管道或 BigQuery ETL 合作伙伴之一提供的 ETL tool。

【讨论】:

2013 年更新:您现在可以在 2 个大表中使用 JOIN EACH。【参考方案2】:

正如 Felipe 在评论中提到的那样。 BigQuery 允许将修饰符“EACH”加入 JOIN 以允许 2 个大表的 JOIN。从查询参考页面 -

正常的 JOIN 操作要求右侧表包含少于 8 MB 的压缩数据。 EACH 修饰符是一个提示,通知查询执行引擎 JOIN 可能引用两个大表。 EACH 修饰符不能用于 CROSS JOIN 子句。

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

【讨论】:

以上是关于加入 Google Bigquery的主要内容,如果未能解决你的问题,请参考以下文章

google bigQuery 子查询加入

加入 Google Bigquery

加入行 Google BigQuery

通过 Cloud Datalab 加入 Google BigQuery

Twilio 加入 Google Hangouts 电话会议

Google Bigquery 外部加入 UNNEST