Hive 查找最接近lat和long值的位置

Hive 查找最接近lat和long值的位置,hive,geospatial,geohashing,Hive,Geospatial,Geohashing,我有两个表t1和t2(t1的大小是t2的十分之一)。每个表有两列,其中包含一些点的纬度和经度。对于t1中的每一行,我想在t2中找到最接近它的那一行。做这件事最有效的查询是什么?Hive有任何用于地理空间搜索的库吗?您需要做一些尝试 请参阅这篇关于 我认为最后一个例程是您正在寻找的(您需要修改它以供使用): 只是想给下一个这样做的人一点帮助:我最终将数据移动到Solr,并使用它的快速地理空间搜索进行查询。索尔做这件事非常快。 CREATE DEFINER=`root`@`localhost` PR

我有两个表
t1
t2
t1
的大小是
t2
的十分之一)。每个表有两列
,其中包含一些点的纬度和经度。对于
t1
中的每一行,我想在
t2
中找到最接近它的那一行。做这件事最有效的查询是什么?Hive有任何用于地理空间搜索的库吗?

您需要做一些尝试

请参阅这篇关于

我认为最后一个例程是您正在寻找的(您需要修改它以供使用):


只是想给下一个这样做的人一点帮助:我最终将数据移动到Solr,并使用它的快速地理空间搜索进行查询。索尔做这件事非常快。
CREATE DEFINER=`root`@`localhost` PROCEDURE closest_restaurants_optimized`
(IN units varchar(5), IN lat Decimal(9,6), IN lon Decimal(9,6), 
IN max_distance SMALLINT, IN limit_rows MEDIUMINT)
BEGIN
    DECLARE ONE_DEGREE_CONSTANT TINYINT;
    DECLARE EARTH_RADIUS_CONSTANT SMALLINT;
    DECLARE lon1, lon2, lat1, lat2 float;  
    IF units = 'miles' THEN
        SET ONE_DEGREE_CONSTANT   = 69;
        SET EARTH_RADIUS_CONSTANT = 3959;
    ELSE -- default to kilometers
        SET ONE_DEGREE_CONSTANT   = 111;
        SET EARTH_RADIUS_CONSTANT = 6371;
    END IF;  
    SET lon1 = lon-max_distance/abs(cos(radians(lat))*ONE_DEGREE_CONSTANT);
    SET lon2 = lon+max_distance/abs(cos(radians(lat))*ONE_DEGREE_CONSTANT);
    SET lat1 = lat-(max_distance/ONE_DEGREE_CONSTANT);
    SET lat2 = lat+(max_distance/ONE_DEGREE_CONSTANT);
    SELECT pm1.post_id, p.post_title,
        ROUND((EARTH_RADIUS_CONSTANT * acos( cos( radians(lat) ) 
            * cos( radians(pm1.meta_value) ) 
            * cos( radians(pm2.meta_value) - radians(lon)) + sin(radians(lat)) 
            * sin( radians(pm1.meta_value)))
        ), 3) AS distance
    FROM goodfood_wp_md20m_postmeta AS pm1, 
        goodfood_wp_md20m_postmeta AS pm2,
        goodfood_wp_md20m_posts    AS p 
    WHERE pm1.meta_key = 'latitude' AND pm2.meta_key = 'longitude'
    AND pm1.post_id = pm2.post_id
    AND pm1.post_id = p.id
    AND p.post_status = 'publish'
    AND pm2.meta_value between lon1 and lon2 
    AND pm1.meta_value between lat1 and lat2
    ORDER BY distance ASC
    LIMIT limit_rows;
END