您已经确定了使用交叉连接在边界框/圆圈内查找区域的解决方案,如下所示:
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?
但是,查询需要一个小时,不会产生任何结果,也不会显示任何错误。
你能否找到解决这个难题的可能途径?
答案 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`