【问题标题】:Optimize Distance Calculation in BigQuery优化 BigQuery 中的距离计算
【发布时间】:2020-10-21 01:48:12
【问题描述】:

我正在尝试在 BigQuery 中优化以下查询。

  Table1 has ~400K rows
  Table2 has 34M rows

我必须将 Table1 中的每个 ID 映射到 Table2 中最接近的 Zipcode。

Table1和Table2都有经纬度数据

WITH
tmp1 AS (
SELECT
 ID, latitude, longitude 
 FROM `Table1`),

tmp2 AS (
SELECT
  CAST(ZipCode AS string) AS ZipCode ,lat,lon
  FROM `Table2` )

 SELECT
 AS VALUE ARRAY_AGG(STRUCT<ID STRING,ZipCode STRING, distance int64>(ID,
  ZipCode,
  CAST(ST_DISTANCE(tmp1.point,
      tmp2.point) AS int64))
  ORDER BY
  ST_DISTANCE(tmp1.point,
  tmp2.point)
  LIMIT
   1)[
  OFFSET
  (0)]
  FROM 
  (
  SELECT
 ID,ST_GEOGPOINT(longitude,latitude) point
  FROM tmp1) tmp1
  CROSS JOIN (
 SELECT
 ZipCode, ST_GEOGPOINT(lon, lat) point
  FROM tmp2) tmp2

将不胜感激任何帮助!

【问题讨论】:

  • 您对已有的查询有任何疑问吗?
  • 这需要很多时间。查询运行了 30 多分钟,但仍然没有输出。我猜是因为它在 Table2 中交叉连接了所有 400k 记录和 34M 行。我正在尝试通过添加约束来查看是否有更快的方法。

标签: google-bigquery distance geo


【解决方案1】:

BigQuery 可以非常高效地进行空间连接,匹配两个表之间的特定距离内的项目。但是您需要知道具体的距离,或者尝试多个距离,直到更新所有点。

这篇文章更详细地讨论了它: https://medium.com/@mentin/nearest-neighbor-in-bigquery-gis-7d50ebd5d63

您可以使用 BigQuery 脚本将其自动化,这是一个想法,尽管它讨论了一个稍微不同的问题,即与单点最近的几何: https://medium.com/@mentin/nearest-neighbor-using-bq-scripting-373241f5b2f5

【讨论】:

    【解决方案2】:

    您在查询的最后缺少GROUP BY ID
    我认为这可能会导致缓慢以及所有这些 CAST ...

    试试下面的版本

    #standardSQL
    WITH tmp1 AS (
      SELECT ID, ST_GEOGPOINT(longitude, latitude) point
      FROM `Table1`
    ), tmp2 AS (
      SELECT CAST(ZipCode AS string) AS ZipCode, ST_GEOGPOINT(lon, lat) point
      FROM `Table2`
    )
    SELECT AS VALUE ARRAY_AGG(
      STRUCT(ID, ZipCode, distance)
      ORDER BY distance
      LIMIT 1
    )[OFFSET(0)]
    FROM (
      SELECT ID, ZipCode, ST_DISTANCE(tmp1.point, tmp2.point) AS distance
      FROM tmp1, tmp2
    )
    GROUP BY ID    
    

    【讨论】:

    • 谢谢,但查询已经运行了一个多小时。我们可以添加任何约束让它运行得更快吗?
    • 当然。这取决于您的业务逻辑。例如,您可以添加在同一邮政编码或县或州内的条件
    • 如果 BigQuery 有 st_nearestneighbors 函数会不会很好,它只计算 K 个最近的对象(在这种情况下 K=1),而不必计算昂贵的交叉连接和 st_distance...跨度>
    • 我认为,这就是k-means clustering 可以首先使用的地方,而不是将集群作为约束
    猜你喜欢
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 2021-04-06
    • 2020-12-26
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2014-04-29
    相关资源
    最近更新 更多