我正在使用 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
答案 0 :(得分:1)
评论太长了。
您无法仅通过操作操作来重写查询以提高效率。不幸的是,您所描述的逻辑需要将每个商店与每个兴趣点进行比较。
一种选择是设置一个阈值——比如 10 英里或 100 公里或其他。不是只存储每个地理点的点,而是存储一个以该点为中心的“圆”。然后在进行排序之前寻找重叠。
这应该会减少子查询(或连接)所需的数据量。