您已经确定了使用交叉连接在边界框/circle中查找区域的解决方案,如下所示:
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)内的最新经度集?
我的查询被屏蔽,如下所示:
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?
但是,查询需要一个小时,不会产生任何结果,也不会显示任何错误。
你能找出一条可能的路径来解决这个难题吗?
发布于 2015-03-13 20:31:43
您看到的问题是,交叉连接生成了太多的中间值(60亿x 1k =6万亿)。
解决这个问题的方法是生成更少的输出。如果您有其他可以应用的筛选器,则应该在执行联接之前尝试应用这些筛选器。如果您可以在连接之前执行group by (或其中的一部分),这也会有所帮助。
此外,为了进行查找,您可以先进行更粗粒度的查找。也就是说,如果您可以使用具有过程粒度区域的较小的表进行初始交叉连接,那么您可以对区域id上的较大的表进行连接,而不是进行交叉连接。
发布于 2015-03-13 20:25:06
好的,所以假连接在最后是有效的,解决方案是:
` 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`
https://stackoverflow.com/questions/29030491
复制相似问题