首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Google Big Query中使用intervals连接两个表?

如何在Google Big Query中使用intervals连接两个表?
EN

Stack Overflow用户
提问于 2015-03-13 18:58:09
回答 2查看 341关注 0票数 1

您已经确定了使用交叉连接在边界框/circle中查找区域的解决方案,如下所示:

代码语言:javascript
复制
SELECT A.ID, C.Car 
FROM Cars C 
CROSS JOIN Areas A
WHERE C.Latitude BETWEEN A.LatitudeMin AND A.LatitudeMax AND
  C.Longitude BETWEEN A.LongitudeMin AND A.LongitudeMax

网址:How to cross join in Big Query using intervals?

然而,由于基础设施的限制,使用大型数据集的交叉联接会被GBQ ops团队阻止。

因此,我问题是:我如何在大数据表(表A)中找到位于另一组边界框(表B)内的最新经度集?

我的查询被屏蔽,如下所示:

代码语言:javascript
复制
select a.a1, a.a2 , a.mdl, b.name, count(1) count 
from TableMaster a 
CROSS JOIN places_locations b 
where (a.lat 
    BETWEEN  b.bottom_right_lat AND b.top_left_lat) 
AND (a.long 
    BETWEEN b.top_left_long AND b.bottom_right_long) 
group by ....

TableMaster为538 GB,6,658,716,712行(清理/绝对最小值)每个查询的places_locations大小约为5到100kb。

我尝试过基于一个模板调整假连接:How to improve performance of GeoIP query in BigQuery?

但是,查询需要一个小时,不会产生任何结果,也不会显示任何错误。

你能找出一条可能的路径来解决这个难题吗?

EN

回答 2

Stack Overflow用户

发布于 2015-03-13 20:31:43

您看到的问题是,交叉连接生成了太多的中间值(60亿x 1k =6万亿)。

解决这个问题的方法是生成更少的输出。如果您有其他可以应用的筛选器,则应该在执行联接之前尝试应用这些筛选器。如果您可以在连接之前执行group by (或其中的一部分),这也会有所帮助。

此外,为了进行查找,您可以先进行更粗粒度的查找。也就是说,如果您可以使用具有过程粒度区域的较小的表进行初始交叉连接,那么您可以对区域id上的较大的表进行连接,而不是进行交叉连接。

票数 2
EN

Stack Overflow用户

发布于 2015-03-13 20:25:06

好的,所以假连接在最后是有效的,解决方案是:

代码语言:javascript
复制
` select a.B, a.C , count(1) count from ( SELECT B,  C, A, lat, long from [GB_Data.PlacesMasterA] WHERE not B

为null)一个JOIN (SELECT top_left_lat,top_left_long,bottom_right_lat,bottom_right_long,A from Places.placeABOXA )b on a.A=b.A where (a.lat在b.bottom_right_lat和b.top_left_lat之间)和(a.long在b.top_left_long和b.bottom_right_long之间) group各按B,C`

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29030491

复制
相关文章

相似问题

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