sql - BigQuery 如何执行空间连接?

标签 sql google-cloud-platform google-bigquery

来自official docs我们读到 LEFT/RIGHT/FULL OUTER JOINS 没有针对空间数据进行优化。我一直在运行几个对 GEOGRAPHY 数据类型使用复杂连接的长查询。

我的问题是,BigQuery 如何在幕后处理空间数据连接?是否所有内容都转换为 Geohash?

我已经尝试通过 GEOGRAPHY 类型的列对我的表进行聚类,但到目前为止,速度改进微乎其微。

如果我在 JOIN 的 where 子句中使用 Geohash (STRING) 而不是 GEOGRAPHY 类型,这会导致性能提升吗?

这是我正在谈论的例子:

select t1.Geohash, t1.Name, t1.Way, t1.Long, t1.Lat, t1.CoreInt
       , t1.Label, t1.IntLat, t1.IntLong
       , row_number() over(partition by Geohash order by Dist) as RowNum
       , Distance
  from table_name t1
  left outer join (select Geohash, Label from table where CoreInt = 1) t2 
 using (Geohash)
 where t2.Label is null
    or t1.Label = t2.Label

谢谢

最佳答案

是的,BigQuery 尚未优化 LEFT/RIGHT/OUTER 空间连接。

现在您需要将此类联接转换为 INNER JOIN + 选择不匹配的行,例如,请参见以下问题: How to JOIN in geography columns using ST_CONTAINS in Big query

BigQuery 在内部使用 S2 索引。它可能比加入 geohash 更快或更慢,具体取决于数据。但与在 geohash 上加入不同,它保证了正确的结果。

加入Geohash有两个主要问题:

1) Geohash 桶不是统一的,相同固定长度的 geohashes 描述了赤道附近比两极附近大得多的真实区域。 S2 提供更统一的索引。

2) Geohash 也可能会遗漏一些应该连接的对,当两个地理位置足够接近但刚好跨越 geohash split 边界并因此散列为不同的值时。例如,刚好低于和刚好高于 45 平行线的点将具有不同的 geohash 值,即使它们非常接近,并且人们希望它们加入。

关于sql - BigQuery 如何执行空间连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56977154/

相关文章:

MySQL 按拥有和不拥有特性排序

google-cloud-platform - GCP 中的 Pass-through 型负载均衡器和 Proxy 型负载均衡器有什么区别

google-bigquery - 在 Bigquery 中——如何从 Firebase 事件表中查询昨天的数据和最近 7 天的数据

sql - sqlite的聚合函数

c# - 可扩展性位置距离搜索全美国超过 100,000 个 LatLng 位置

sql - 使用 Postgres 在 json 数组中索引对象元素

sql - 为什么在插入时间分区的 BigQuery 表时流数据未分区?

google-app-engine - 同一项目中 appengine 上的多个 cron.yaml

google-bigquery - 访问 Google Sheets 联合表时的 BigQuery 凭据问题

java - 如何从 Java 在 BigQuery 中创建分区表?