Presto 中的最近邻子查询

时间:2021-01-28 14:06:19

标签: sql presto trino

我正在使用 Presto 329 并尝试重写以下交叉联接以提高效率,方法是将 CROSS 联接替换为每行的有效内部查询:

SELECT
    a.store_id,
    min(great_circle_distance(a.latitude, a.longitude,
        CAST(b.latitude AS double), CAST(b.longitude AS double))) AS distance
FROM store_location a
CROSS JOIN places_of_interest b
GROUP BY a.store_id;

为了说明,store_location 包含建筑物的位置,places_of_interest 包含热门旅游景点的具体坐标。我想找到离每家商店最近的旅游景点——最近邻问题。

我一直在潜入 Presto 子查询的世界,但运气不佳。我尝试了子查询和 LATERAL 的各种组合,围绕以下代码段的主题,但没有成功。

SELECT a.store_id,
       (SELECT b.poi_id,
               great_circle_distance(a.latitude, a.longitude,
                   CAST(b.latitude AS double), CAST(b.longitude AS double)) AS distance
        FROM places_of_interest
        ORDER BY 2
        LIMIT 1) AS b (poi_id, distance)
FROM store_location a

1 个答案:

答案 0 :(得分:1)

评论太长了。

您无法仅通过操作操作来重写查询以提高效率。不幸的是,您所描述的逻辑需要将每个商店与每个兴趣点进行比较。

一种选择是设置一个阈值——比如 10 英里或 100 公里或其他。不是只存储每个地理点的点,而是存储一个以该点为中心的“圆”。然后在进行排序之前寻找重叠。

这应该会减少子查询(或连接)所需的数据量。