Как преобразовать таблицу SQL в список последовательностей строк, используя BigQuery и Apache Beam? - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть очень большая таблица, где каждая строка представляет абстракцию, называемую Trip. Поездки состоят из числовых столбцов, таких как идентификатор транспортного средства, идентификатор поездки, время начала, время остановки, пройденное расстояние, продолжительность вождения и т. Д. Таким образом, каждая поездка представляет собой одномерный вектор значений с плавающей запятой.

Я хочу преобразовать этотаблица или список векторов, в список последовательностей отключений, в которых отключения группируются в последовательности по идентификатору транспортного средства и располагаются в порядке, соответствующем времени начала. Длина последовательности должна быть ограничена определенным размером, например 256, но может / должно быть несколько последовательностей с одним и тем же идентификатором VehicleId.

Пример:
(длина последовательности = 4)

[  
(Vehicle1, [Trip1, Trip2, Trip3, Trip4]),  
(Vehicle1, [Trip5, Trip6, Trip7]),  
(Vehicle2, [Trip1, Trip2, Trip3, Trip4])  
]

Я пытаюсь смоделировать схемы вождения на основе этих поездок, используя основанную на последовательности модель, такую ​​как LSTM / Transformer. Представьте каждую поездку как вложение слова и каждую последовательность поездок как предложение. Каким-то образом мне нужно построить эти предложения с помощью комбинации функций BigQuery / Apache Beam (или любых других рекомендуемых инструментов), поскольку речь идет о сотнях гигабайт данных. Я довольно плохо знаком с обоими инструментами, поэтому любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 04 ноября 2019

Ниже для стандартного SQL BigQuery

#standardSQL
SELECT trip.vehicle_id, ARRAY_AGG(trip ORDER BY trip.start_time) trips
FROM (
  SELECT trip, DIV(ROW_NUMBER() OVER(PARTITION BY vehicle_id ORDER BY start_time) - 1, 4) grp   
  FROM `project.dataset.table` trip
)
GROUP BY trip.vehicle_id, grp

Выше подразумевается упорядочение поездок по start_time и длине последовательности = 4
Кроме того, он возвращает vehicle_id как часть информации о поездке в массиве - как показано нижепример

Row vehicle_id  trips.vehicle_id    trips.trip_id   trips.start_time    trips.stop_time  
1   Vehicle1    Vehicle1            Trip1           1                   2    
                Vehicle1            Trip2           2                   3    
                Vehicle1            Trip3           3                   4    
                Vehicle1            Trip4           4                   5    
2   Vehicle1    Vehicle1            Trip5           5                   6    
                Vehicle1            Trip6           6                   6    
                Vehicle1            Trip7           7                   6    
3   Vehicle2    Vehicle2            Trip1           2                   3    
                Vehicle2            Trip2           3                   4    
                Vehicle2            Trip3           4                   5    
                Vehicle2            Trip4           5                   6    

Чтобы устранить это - попробуйте ниже

#standardSQL
SELECT vehicle_id,
  ARRAY( 
    SELECT AS STRUCT * EXCEPT(vehicle_id)
    FROM UNNEST(trips)
    ORDER BY start_time
  ) trips
FROM (
  SELECT trip.vehicle_id, ARRAY_AGG(trip ORDER BY trip.start_time) trips
  FROM (
    SELECT trip, DIV(ROW_NUMBER() OVER(PARTITION BY vehicle_id ORDER BY start_time) - 1, 4) grp   
    FROM `project.dataset.table` trip
  )
  GROUP BY trip.vehicle_id, grp
)


Row vehicle_id  trips.trip_id   trips.start_time    trips.stop_time  
1   Vehicle1    Trip1           1                   2    
                Trip2           2                   3    
                Trip3           3                   4    
                Trip4           4                   5    
2   Vehicle1    Trip5           5                   6    
                Trip6           6                   6    
                Trip7           7                   6    
3   Vehicle2    Trip1           2                   3    
                Trip2           3                   4    
                Trip3           4                   5    
                Trip4           5                   6    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...