加入Google Bigquery

use*_*066 7 google-bigquery

我知道正在努力改进Bigquery上的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
Run Code Online (Sandbox Code Playgroud)

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

这可以以某种方式修复还是我被破坏了?如果是这样,任何人都知道我可以用来分析支持连接的大数据集的任何其他服务?

编辑:这是实际的查询;

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;
Run Code Online (Sandbox Code Playgroud)

Mic*_*hri 10

您可以将此查询表达为仅引用cdrs_test.geoIP_Left您感兴趣的列的子选择.请参阅此处的第二个示例.

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;
Run Code Online (Sandbox Code Playgroud)

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

最后,另一种选择是使用(例如)MapReduce转换管道或其中一个BigQuery ETL合作伙伴提供的ETL工具预加入数据.


Vai*_*hav 6

正如费利佩在评论中提到的那样.BigQuery允许一个修饰符"EACH"来加入以允许两个大表的JOIN.从"查询参考"页面 -

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

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