使用Big Query中两个来源的数据创建Google Data Studio GPS报告 - 计划的报告数据和实时数据

问题描述 投票:0回答:1

我想在这篇文章前加上说我是SQL新手,BigQuery的新手和第一次海报,所以提前感谢!

我目前正在Google Data Studio中重新创建一份报告,该报告最初是在Excel中为公交公司构建的,该公司将每日计划与我们每天从第三方软件收到的数据进行比较。 “计划”数据表包括路线名称,位置名称,预定时间和GPS坐标。我们从第三方软件收到的“实时”数据包括:每40秒的日期,时间戳以及该时间戳的GPS坐标。请注意,没有“路线名称”,这对我后来的问题很关键。

第三方CSV数据每天作为单独的CSV文件上传到Google Cloud Data Storage存储桶,后者又作为一个单一的实时数据表连接到Google BigQuery,可以与Schedule数据表进行比较。

此报告的目的是能够将上传的实时数据表与计划数据进行比较,以创建Google Data Studio报告,我们的物流团队可以检查这些报告以回答两个主要问题:1)公交车准时性 - 是那天的公共汽车准时,如果是晚了,多少。 2)公交车的位置 - 每个时间戳的公交GPS位置与预定的GPS坐标相关的位置。我理想的报告会有过滤器来选择不同的公交路线并选择有问题的日期。

我的第一个问题在于如何构建此报告。我设想我将需要与我的数据进行连接,显然,两个LEFT连接回答我的两个关键问题如下:1)通过GPS坐标左边连接的准时计算,和2)通过左边的GPS计算通过时间戳加入。

如果这个大纲是明确的,并且我使用两个LEFT连接的建议是正确的,我怀疑可能不是这样,由于下面讨论的原因,让我们继续进行第二阶段。这是一个很好的检查点,对于那些阅读到目前为止并且认为我需要对我的方法进行更改的人。

继续,当我加入我的两个表时,我最初观察了以下技术因素,我需要一些帮助:

1)实时数据的时间戳每40秒采集一次。因此,我不一定在确切的时间戳上有公交车的数据,例如我的时间表中的公共汽车是在09:00的位置x,但是,我在我的实时数据中最接近的时间戳可能是09:00:04。如何匹配该数据以选择正确的数据点。最初,我考虑减少有效数字的数量,但是,我接着考虑了这个例子,在这个例子中我会在40:00后的09:00:44得到一个数据点。随着有效数字的减少 - 09:00,将有两个匹配的数据点,它们将被视为相同。任何想法?也许是MIN的LEFT加入。

2)要匹配的GPS坐标。我试图使用ST_CLOSESTPOINT Geography函数但我不完全理解它ST_CLOSESTPOINT(geography_1,geography_2 [,spheroid = FALSE])。什么是spheroid = FALSE?(https://cloud.google.com/bigquery/docs/reference/standard-sql/geography_functions)。

3)第三,也是目前我最困难的问题,我的实时数据表链接到具有超过一年CSV文件的Google数据存储桶,用于9种不同路由的不同总线 - 每天每条总线1个CSV文件。此外,如第2段所述,我的实时数据中没有“路线名称”,只有一堆GPS坐标和时间戳。我需要考虑一种方法,能够使用我的Schedule数据表区分这些不同的CSV文件,以便它可以在Google Data studio中使用前面提到的两个过滤器,首先选择Bus Routes然后选择日期。正是这一点让我怀疑LEFT连接是否合适,因为已经加入的数据无法实现此功能。目前,对于大型实时数据集,与我的计划数据表的连接随机匹配该数据集中最近的最接近的数据集,无法按日选择等。

这是一个非常大的项目,有点超出我的舒适范围和一个长期详细的问题,但任何指导都会非常感激,因为我对SQL和BigQuery相对较新。

提前谢谢了!

// JOIN 1 - via ST_CLOSESTPOINT to determine punctuality of the bus


SELECT
r1.Direction,
r1.ScheduledLocation,
r1.ScheduledNextLocation,
r1.ScheduledTime,
r1.ScheduledCoordinates,
r1.ScheduledXCoordinates,
r1.ScheduledYCoordinates,
r1.ScheduledFullCoordinates,
r2.RealTime,
r2.RealTimeDate,
r2.RealTimeXCoordinates,
r2.RealTimeYCoordinates,
r2.RealTimeFullCoordinates,

ST_CLOSESTPOINT(r1.ScheduledFullCoordinates, r2.RealTimeFullCoordinates) as ClosestPoint

FROM `SCHEDULE DATA SOURCE` r1

LEFT JOIN `REAL-TIME DATA SOURCE` r2 ON r1.ScheduledTime = r2.RealTime 



// JOIN 2 - via Timestamp to determine GPS location of the bus
SELECT  
r1.Direction,
r1.ScheduledLocation,
r1.ScheduledNextLocation,
r1.ScheduledTime,
r1.ScheduledCoordinates,
r1.ScheduledXCoordinates,
r1.ScheduledYCoordinates,
r1.ScheduledFullCoordinates,
r2.RealTime,
r2.RealTimeXCoordinates,
r2.RealTimeYCoordinates,
r2.RealTimeFullCoordinates

FROM `SCHEDULE DATA SOURCE` r1

LEFT JOIN `REAL-TIME DATA SOURCE` r2 ON r1.ScheduledTime = r2.RealTime
sql google-bigquery google-data-studio
1个回答
0
投票

你可以做什么而不是加入是使用分析功能。我假设每条公交线路的数据足够小。如果在同一查询中有多个总线路由 - 请添加PARTITION BY。

我使用r1作为样本预定时间/位置,并使用r2作为实时/位置。然后我将它们联合起来并添加sched标志,表示这是预定的还是实时的。然后按时间对所有事件进行ORDER,并为每个事件添加上一个和下一个位置。您现在可以仅过滤预定的活动 - 对于您将拥有的每个活动以及之前的位置。我的代码有点简单,因为它可能选择上一个或下一个预定的事件,而不是上一个或下一个真实事件。但是,如果真实事件经常被收集到不太可能发生。

最后,关于ST_CLOSESTPOINT - 该函数用于查找最接近另一个复杂形状的一个复杂形状的点。我不认为你需要它,因为你处理点,所以它只返回单个可用点,即它的第一个参数。你需要的是ST_DISTANCE来计算到真实点的距离。我计算两个距离,前一个真实事件和下一个真实事件,并选择一个更近的距离。

with r1 as (
    select time(10, 0, 0) as sched_tm, ST_GeogPoint(10, 10) as sched_loc union all
    select time(10, 10, 0) as sched_tm, ST_GeogPoint(11, 11) as sched_loc union all
    select time(10, 20, 0) as sched_tm, ST_GeogPoint(12, 13) as sched_loc 
), r2 as (
    select time(10, 0, 10) as real_tm, ST_GeogPoint(10.1, 10) as real_loc union all
    select time(10, 0, 50) as real_tm, ST_GeogPoint(10.2, 10) as real_loc union all
    select time(10, 9, 40) as real_tm, ST_GeogPoint(10.9, 11) as real_loc union all
    select time(10, 10, 20) as real_tm, ST_GeogPoint(11.1, 11) as real_loc union all
    select time(10, 20, 0) as real_tm, ST_GeogPoint(12, 13) as real_loc 
), r12 as (
    select TRUE as sched, sched_tm tm, sched_loc as loc from r1 
    union all 
    select FALSE as sched, real_tm tm, real_loc as loc from r2
), r12_sort as (
    select sched, tm, loc, 
           LAG(loc, 1) OVER(ORDER BY tm) as prev_loc, 
           LEAD(loc, 1) OVER(ORDER BY tm) as next_loc 
    from r12 
)
select sched, tm as sched_tm, loc, prev_loc, next_loc, 
     LEAST(coalesce(st_distance(loc, prev_loc), 1e9),
           coalesce(st_distance(loc, next_loc), 1e9)) as distance
from r12_sort
where sched

结果是这样的:

Line sched  sched_tm  loc           prev_loc        next_loc         distance   
1    true   10:00:00  POINT(10 10)  null            POINT(10.1 10)   10950.579731746193
2    true   10:10:00  POINT(11 11)  POINT(10.9 11)  POINT(11.1 11)   10915.213347763152
3    true   10:20:00  POINT(12 13)  POINT(11.1 11)  POINT(12 13)     0.0
© www.soinside.com 2019 - 2024. All rights reserved.