如何在Google Big Query中使用间隔加入两个表格?

时间:2015-03-13 10:58:09

标签: google-bigquery bounding-box

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

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运营团队阻止了对大型数据集使用交叉连接 因此,我的问题是:我怎样才能在大数据表(表A)中找到另一组边界框内的lat,long(小数据集)(表B)?

我的查询已被阻止:

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?

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

你能否找到解决这个难题的可能途径?

2 个答案:

答案 0 :(得分:2)

您遇到的问题是交叉连接会产生太多中间值(60亿x 1k = 6万亿)。

解决这个问题的方法是减少产出。如果您可以申请其他过滤器,则应在尝试加入之前尝试应用它们。如果您可以在加入之前通过(或部分)进行分组,那也会有所帮助。

此外,为了进行查找,您可以先进行更粗粒度的查找。也就是说,如果您可以使用包含课程粒度区域的较小表格进行初始交叉连接,那么您可以在区域ID上加入较大的表格,而不是进行交叉连接。

答案 1 :(得分:1)

okey所以假连接最终会起作用,解决方案:

` select a.B, a.C , count(1) count from ( SELECT B,  C, A, lat, long from [GB_Data.PlacesMasterA] WHERE not B

为空)a JOIN(选择top_left_lat,top_left_long,bottom_right_lat,bottom_right_long,A来自 [Places.placeABOXA])b在a.A = b.A上 哪里 (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)将每个分组为B,C`