首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大查询Dijkstra

大查询Dijkstra
EN

Stack Overflow用户
提问于 2022-11-25 02:24:49
回答 2查看 54关注 0票数 0

我试图使用两个表在bigquery上运行Dijkstra算法。第一个表具有节点信息(ID、纬度、经度),第二个表具有顶点信息(Start_node_ID、End_node_ID、节点之间的距离)。我不知道如何开始这个项目,我对bigquery没有太多的经验,我见过一些人在SQL上做了类似的事情,所以我知道这是可能的,但是我很难在BigQuery上复制它。

所有的帮助都是欢迎的,谢谢你的时间。

在这里,它的数据看起来是谁,一些顶点只朝一个方向走。

代码语言:javascript
复制
NODE

 1. |ID|LAT|LONG|
 2. |1 |1.2| 1.3|
 3. |2 |1.2| 1.4|
 4. |3 |3.4|-2.5|
代码语言:javascript
复制
VERTEX

 1. |STR|END|DST|
 2. | 1 | 2 | 3 |
 3. | 2 | 1 | 3 |
 4. | 1 | 3 | 4 |

我尝试了以下代码,但不确定如何将其转换为bigquery

https://kainwen.com/2019/10/31/dijkstra-via-sql-a-glance-at-recursive-cte/

EN

回答 2

Stack Overflow用户

发布于 2022-11-25 12:55:28

递归CTE在BigQuery中是支持的,但是有一些限制可能是您的用例的关键。

让我们以这里解释的最后SQL代码为例:https://kainwen.com/2019/10/31/dijkstra-via-sql-a-glance-at-recursive-cte/

并将其翻译为BigQuery:

代码语言:javascript
复制
create OR REPLACE table `qwiklabs-gcp-01-6fe73054adde.data.roadmap`(a int, b int, d int);
insert into `qwiklabs-gcp-01-6fe73054adde.data.roadmap` values
(1, 2, 7),
(1, 3, 9),
(1, 6, 14),
(2, 3, 10),
(2, 4, 15),
(3, 4, 11),
(3, 6, 2),
(4, 5, 6),
(5, 6, 9);

create OR REPLACE table `qwiklabs-gcp-01-6fe73054adde.data.roadmap_sym`
AS SELECT * FROM `qwiklabs-gcp-01-6fe73054adde.data.roadmap`;

insert into `qwiklabs-gcp-01-6fe73054adde.data.roadmap_sym` select b,a,d from `qwiklabs-gcp-01-6fe73054adde.data.roadmap`;
insert into `qwiklabs-gcp-01-6fe73054adde.data.roadmap_sym` values (null, null, null);
 
create OR REPLACE table `qwiklabs-gcp-01-6fe73054adde.data.known`
AS SELECT * FROM `qwiklabs-gcp-01-6fe73054adde.data.roadmap`
WHERE 1<>1;


insert into `qwiklabs-gcp-01-6fe73054adde.data.known` values (6, 3, 2);
 
with recursive sp as
(
select * from `qwiklabs-gcp-01-6fe73054adde.data.known`
union all
select a, b, d
from
(
  select
    a, b, d, s, rank() over (order by (d+s)) as rk
  from
  (
    select a, b, d, s
    from
    (
      select
      a, b, min(d) as d, sum(t) as s
      from
      (
        select
          sp.a as a,
          case
        when rm.a is null then sp.b
        else rm.b
      end as b,
          case
        when rm.a is null then sp.d
            when sp.a = rm.a then rm.d
            else sp.d + rm.d
          end as d,
      case
        when rm.a is null then 1000
        else 0
      end as t
        from
          sp, `qwiklabs-gcp-01-6fe73054adde.data.roadmap_sym` as rm
        where
      rm.a is null
      or
      (
            (sp.a = rm.a or
             sp.b = rm.a) and
            sp.a <> rm.b
      )
      ) x
      group by a, b
    )y
  )z
)q where rk = 1 or s = 1000
)
select * from sp where b = 4 limit 1;

由于以下错误,BigQuery在执行CTE时将失败:

代码语言:javascript
复制
A subquery containing a recursive reference may not use DISTINCT, GROUP BY, or any aggregate function

考虑到这一点,您可以利用递归的CTE,但是对于某些查询,现有的限制可能是一个阻止器问题。

请看一下这里记录的所有规格和限制:https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#recursive_keyword

票数 0
EN

Stack Overflow用户

发布于 2022-11-29 07:07:15

在SQL中这样的函数是相当棘手的。编写JavaScript UDF通常是有意义的。

Carto编写了这样的路由算法代码,您可能会看到是否可以将其修改为您的数据:https://carto.com/blog/how-to-do-route-optimization-at-scale-with-carto-bigquery/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74567795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档