BigQuery如何执行空间连接?

man*_*ioz 2 sql google-bigquery google-cloud-platform

官方文档中,我们了解到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
Run Code Online (Sandbox Code Playgroud)

谢谢

Mic*_*tin 5

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

现在,您需要将此类联接转换为INNER JOIN +选择不匹配的行,例如,请参见以下问题: 如何在Big查询中使用ST_CONTAINS在地理列中进行联接

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

加入Geohash有两个主要问题:

1)地质哈希桶不是均匀的,固定长度的地质哈希描述的赤道附近的实际面积比两极附近更大。S2提供更统一的索引。

2)当两个地理区域足够接近但正好跨越geohash分割边界并因此哈希为不同的值时,Geohash也可能会错过一些应加入的对。例如,平行点以下和平行点上方45个点将具有不同的geohash值,即使它们非常接近,并且人们希望它们可以合并。