【问题标题】:How can I join two tables using intervals in Google Big Query?如何在 Google Big Query 中使用间隔连接两个表?
【发布时间】:2015-05-15 19:58:32
【问题描述】:

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

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

我的如下查询已被屏蔽:

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?

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

您能找出解决这个难题的可能途径吗?

【问题讨论】:

  • 您有数据样本吗?我对places_locations领域特别感兴趣,了解一下拓扑问题。
  • 抱歉给Jordi添麻烦了,现在可以了,上周不行,可能是部分区块释放的原因,还是谢谢你

标签: google-bigquery bounding-box


【解决方案1】:

好的,所以假加入最后确实有效,解决方案:

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

为空) JOIN (SELECT top_left_lat, top_left_long, bottom_right_lat, bottom_right_long, A from [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 分组 `

【讨论】:

  • 所以在表 a 和 b 中添加了带有字符串“a”的假列
【解决方案2】:

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

解决此问题的方法是生成更少的输出。如果您有其他可以应用的过滤器,您应该在加入之前尝试应用它们。如果您可以在加入之前按(或部分)分组,那也会有所帮助。

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

【讨论】:

  • 嗨,Jordan,感谢您的回答,我仍然无法通过 GBQ 执行此查询,
  • 问题的拓扑是我需要从大表设备ID和模型中提取,条件是它们的纬度和经度适合较小表的边界框。所以,我能够使用 cross 执行它,然后由于资源过度使用而被谷歌阻止,然后我使用假连接解决了这个问题,现在的问题是当较小的表> 1000(大约)时,然后查询运行了几天,但没有产生结果。
  • 我现在正在工作的解决方案是将较小的表分解为每个 1000 行的较小表,这是另一个问题。我正在尝试实施@FelipeHofa 解决方案 [stackoverflow.com/questions/11057219/… 但再次没有结果,查询会持续运行几个小时
  • 这里是一个示例代码:'select a.DevID DeviceId, a.device_mk OS from (SELECT device_id DevID, device_mk, A, lat, long, is_gps from [GB_Data.PlacesMasterAMarch] ....
  • .... 哪里 device_id 为空且 is_gps 为真)一个 JOIN(选择 top_left_lat、top_left_long、bottom_right_lat、bottom_right_long、A、ROW_NUMBER() OVER(ORDER BY A) from (SELECT top_left_lat, top_left_long, bottom_right_lat, bottom_right_long, A from [Karol.fast_food_box] where rn
猜你喜欢
  • 1970-01-01
  • 2016-01-13
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多