【问题标题】:SQL - find distances between two cities, have to format the tableSQL - 查找两个城市之间的距离,必须格式化表格
【发布时间】:2017-02-06 07:22:35
【问题描述】:

我是 SQL 的初学者,并且有一个问题涉及在 Hive 中运行查询,我认为这与 SQL 代码非常相似/相同。我的数据表如下:

name     lat     long
NY       40.3    70.3
SF       36.1    60.2
LA       36.5    53.1
CH       45.2    62.3
...

我需要找到彼此之间一定距离内的所有城市,距离由纬度和经度测量。

我目前关于如何解决这个问题的想法如下:

  1. 如果有 n=10 个城市(因此表中有 n=10 行),则创建一个 (10*9)/2 = 45 行的新表,其中每行现在有 6 列(city1、city2、lat1 , lat2, long1, long2)
  2. 使用这种格式的行,我可以简单地使用类似毕达哥拉斯的计算来计算距离。

我不确定如何在 SQL 中执行第 1 步。本质上,它从第一列创建每个可能的唯一对组合,并包括该行对中每个城市的相应纬度和经度。

这种方法聪明吗?我该如何实施?有没有更好的办法?

谢谢!!

【问题讨论】:

    标签: sql hive


    【解决方案1】:

    您可以通过self-join 完成此任务。

    select 
    d1.name as city1, d2.name as city2,
    d1.lat as lat1, d2.lat as lat2, 
    d1.long as long1, d2.long as long2
    from datatable d1
    join datatable d2 on d1.name < d2.name
    

    编辑:由于 Hive 在 2.2.0 以下的版本中不支持不等式连接,您可以使用

    select 
    d1.name as city1, d2.name as city2,
    d1.lat as lat1, d2.lat as lat2, 
    d1.long as long1, d2.long as long2
    from datatable d1
    join datatable d2 on 1=1
    where d1.name < d2.name
    

    【讨论】:

    • 你的变量让我有点困惑。 d1.city 和 d2.city 不应该是 d1.name 和 d2.name 吗?并且 d1 和 d2 在我的数据库中是同一张表,但是我们以某种方式为它们分配了不同的名称?
    • 对不起,错字了。我现在编辑了它。是的,它们是同一张表,但我们给它们不同的列别名。
    • datatable 是关键字,还是我的表的名称? - 是的,这是一个愚蠢的问题。我不知道我们可以在 d1 和 d2 中使用像这样的两个版本的表格,谢谢
    • 这是你的桌子的名字。
    • Hive 仅支持等式连接、外连接和左半连接。 Hive 不支持非相等条件的连接条件,因为很难将此类条件表示为 map/reduce 作业。
    猜你喜欢
    • 2011-03-25
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    相关资源
    最近更新 更多