Hive SQL怎么利用标志性地点的经纬度算出距离该地点小于5000米以内的另一处标志性地点

有一张储存有标志性建筑的表,其中两个字段:标志性建筑ID(唯一)以及对应的经纬度(WGS-84坐标系),需要算出所有标志性建筑之间经纬度小于5000米距离的数据并打上标签(任意两个标志性建筑之间的距离小于5000米都算),鉴于该表数据量较大放弃使用笛卡尔积的方法,是否还有其它好方法

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: hive sql 求所有用户和活跃用户的总数及平均年龄中的 第一步:因为同一个用户可以活跃多次(在不同时间段内都满足连续登陆2天),但只算一个活跃用户,因此要先去重,先求出活跃用户的id和对应的年龄(去重); 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    select
    	t4.user_id,
    	avg(t4.ag)
    from(
    	select 
    		t3.user_id,
    		min(t3.day_time),
    		max(t3.day_time),
    		count(*),
    		avg(t3.age) ag
    	from(
    		select 
    			t2.user_id,
    			t2.day_time,
    			t2.rk,
    			date_sub(t2.day_time,rk) ds,
    			age
    		from(
    			select 
    				t1.user_id,
    				t1.day_time,
    				row_number() over(partition by t1.user_id order by t1.day_time) rk,
    				t1.age
    			from(select distinct day_time,user_id,age from users) t1
    		) t2
    	) t3 group by t3.user_id,t3.ds having count(*)>=2
    ) t4 group by t4.user_id;
    
    user_id  	age
    test_2  	19.0
    test_4  	35.0
    

    连续登陆3天算活跃用户,就count(*)>=3;

    连续登陆4天算活跃用户,就count(*)>=4;

    连续登陆5天算活跃用户,就count(*)>=5;

    以此逻辑类推;


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

该回答引用gpt
可以使用Hive的地理信息扩展库(Spatial Extension)提供的ST_Distance函数来计算两点之间的距离,并利用Hive SQL的join操作来连接表并筛选出两点之间距离小于5000米的数据。

具体步骤如下:

1.确认使用的地理信息扩展库是否已安装。Hive常用的地理信息扩展库包括Hive-GeoMesa、geomesa-hive-storage、geohive等,可以根据具体情况选择合适的扩展库。

2.将经纬度列转换为Point类型的数据。可以使用ST_Point函数将经纬度转换为Point类型的数据,方便后续的计算和查询。例如,假设原表中经度列为longitude,纬度列为latitude,则可以使用如下语句添加一个新列point:

SELECT ST_Point(longitude, latitude) AS point, *
FROM landmarks_table;

3.进行自连接操作。使用自连接操作将表与自身连接,得到所有可能的点对组合。例如:

SELECT a.landmark_id AS landmark1_id, b.landmark_id AS landmark2_id, a.point AS landmark1_point, b.point AS landmark2_point
FROM landmarks_table a
JOIN landmarks_table b
ON a.landmark_id < b.landmark_id;

在本例中,使用landmark_id列来确定点的唯一标识,并使用a.landmark_id < b.landmark_id的条件限制只选择其中一个点作为符合条件的点对的起点。

4.计算距离并添加标签。使用ST_Distance函数计算两点之间的距离,并使用CASE语句添加标签。例如,假设要给距离小于5000米的点对打上标签为"nearby",可以使用如下语句:

SELECT landmark1_id, landmark2_id,
       CASE WHEN ST_Distance(landmark1_point, landmark2_point) < 5000 
            THEN 'nearby' 
            ELSE 'not nearby' 
       END AS label
FROM point_pairs_table;

5.删除不必要的列。删除不需要输出的原始经纬度列和中间表中多余的列。例如:

SELECT landmark1_id, landmark2_id, label
FROM labels_table;

注意:由于计算距离的过程需要大量的计算资源,当数据量较大的时候可能会出现计算速度慢等问题。可以考虑采用分布式计算框架或者使用索引等技术对计算进行优化。