Создание GPS-отчета Google Data Studio с использованием данных из двух источников в Big Query - данных запланированного отчета и данных в реальном времени - PullRequest
0 голосов
/ 12 февраля 2019

Я бы хотел добавить к этому сообщению префикс, сказав, что я новичок в SQL, новичок в BigQuery и впервые пишу, поэтому заранее спасибо!

В настоящее время я воссоздаю отчет в Google DataСтудия, изначально построенная в Excel для автобусной компании, которая сравнивала бы ежедневное расписание с данными, которые мы ежедневно получаем от стороннего программного обеспечения.Таблица данных «Расписание» включает название маршрута, названия мест, запланированное время и координаты GPS.Данные в режиме реального времени, которые мы получаем от стороннего программного обеспечения, включают в себя: дату, метку времени для каждых 40 секунд и координаты GPS для этой метки времени.Обратите внимание, что «название маршрута» отсутствует, это ключ к дальнейшему обсуждению в моем вопросе.

Сторонние CSV-данные ежедневно загружаются в виде отдельных CSV-файлов в корзину Google Cloud Data Storage, которая, в свою очередь, связана с Google BigQuery в виде единой таблицы данных в реальном времени, готовой для сравнения стаблица данных расписания.

Цель этого отчета - сравнить выгруженную таблицу данных реального времени с данными расписания, чтобы создать отчет Google Data Studio, который наша команда по логистике может проверить, чтобы ответить надва основных вопроса: 1) Пунктуальность автобуса - был ли автобус вовремя в тот день и насколько поздно.2) Местоположение автобуса - где находится точное GPS-местоположение автобуса относительно запланированных GPS-координат, для отметки времени.В моем идеальном отчете были бы фильтры для выбора различных автобусных маршрутов и выбора рассматриваемой даты.

Мой первый запрос заключается в том, как создать этот отчет.Я предполагаю, что мне нужно будет выполнить соединение с моими данными, чтобы быть в явном виде двумя левыми соединениями, которые отвечают на два моих ключевых вопроса следующим образом: 1) расчет пунктуальности при левом соединении с помощью GPS-координат и 2) расчет GPS с помощью левогоприсоединиться через отметки времени.

Если эта схема ясна, и мое предложение использовать два ЛЕВЫХ объединения правильное, что, как я подозреваю, может быть не так по причинам, рассмотренным ниже, давайте перейдем ко второму этапу.Это хороший контрольный пункт для всех, кто до этого момента читал и считал, что мне нужно внести изменения в свой подход.

Двигаясь дальше, когда и когда я присоединяюсь к своим двум таблицам, я изначально наблюдал следующее техническоесоображения, в которых мне понадобится небольшая помощь:

1) Метки времени в данных в реальном времени берутся каждые 40 секунд.Поэтому у меня не обязательно есть данные для автобуса с точными отметками времени, например, автобус в моем расписании должен быть в точке x на 09:00:00, однако моя самая близкая отметка времени в моих данных в реальном времени может быть 09: 00: 04.Как мне сопоставить эти данные, чтобы выбрать правильную точку данных.Сначала я думал об уменьшении числа значащих цифр, однако затем я рассмотрел случай, который будет наблюдаться в этом примере, где у меня также будет точка данных в 09:00:44, 40 секунд спустя.При уменьшении значимых цифр - 09:00, будет две совпадающие точки данных, и они будут рассматриваться как одинаковые.Любая идея?Может быть, осталось присоединиться к MIN.

2) Координаты GPS для сопоставления.Я пытался использовать функцию географии ST_CLOSESTPOINT, но не до конца ее понимаю ST_CLOSESTPOINT (geography_1, geography_2 [, spheroid = FALSE]).Что такое сфероид = ЛОЖЬ? (https://cloud.google.com/bigquery/docs/reference/standard-sql/geography_functions).

3) В-третьих, и в настоящее время моя самая сложная проблема - моя таблица данных в реальном времени связана с корзиной данных Google с файлами CSV за несколько лет для 9 различных шин с разными маршрутами - по 1 файлу CSV на шину надень.Кроме того, как упомянуто в параграфе 2, в моих данных в реальном времени нет «имени маршрута», только набор GPS-координат и отметок времени.Мне нужно придумать, как можно различать эти разные CSV-файлы с помощью моей таблицы данных расписания, чтобы она работала в Google Data Studio с двумя ранее упомянутыми фильтрами, чтобы сначала выбрать автобусные маршруты, а затем выбрать дату,Именно этот вопрос заставляет меня задаться вопросом, подходит ли 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

1 Ответ

0 голосов
/ 13 февраля 2019

Вместо объединения вы можете использовать аналитические функции.Я предполагаю, что данные для автобусного маршрута достаточно малы для этого.Если у вас есть несколько автобусных маршрутов в одном запросе - добавьте PARTITION BY.

Я использовал r1 в качестве выборки запланированного времени / местоположения и r2 в качестве реального времени / местоположения.Затем я объединяю их и добавляю флаг sched, обозначающий, запланировано это или в реальном времени.Затем ЗАкажите все события по времени, и для каждого события добавьте предыдущее и следующее местоположение.Теперь вы можете отфильтровать только запланированное событие - для каждого вы будете иметь следующее и предыдущее местоположение.Мой код несколько упрощен, так как он может выбирать предыдущее или следующее запланированное событие, а не предыдущее или следующее реальное событие.Но если реальные события собираются достаточно часто, это вряд ли произойдет.

Наконец, о 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
...