Пример моделирования данных временных рядов для подключенных транспортных средств

Этот документ является третьим в разделе «Моделирование данных временных рядов». Компания YMatrix считает, что проектирование модели данных напрямую влияет на ценность потребления и использования данных. Поэтому помимо технических объяснений весь этот раздел призван дать вам четкое понимание моделей данных временных рядов — их концепций, областей применения и эволюции.

  • Первая статья, "Что такое модель данных временных рядов?", последовательно отвечает на ряд вопросов, помогая полностью освоить концепцию моделирования данных временных рядов.
  • Вторая, "Подходы к моделированию временных рядов," предоставляет теоретическое руководство по принципам проектирования реляционных моделей в YMatrix.
  • Третья и четвёртая статьи представляют примеры моделирования данных для сценариев подключённых транспортных средств (этот документ) и умного дома. Они демонстрируют передовые практики для различных случаев использования временных рядов в YMatrix, основанные на принципах из статьи "Подходы к моделированию временных рядов".

Примечание!
Данный документ служит лишь примером для справки. Перед началом формального проектирования модели рекомендуется внимательно ознакомиться с архитектурой YMatrix и принципами работы компонентов. За подробностями о механизмах компонентов обратитесь к разделу "Справочное руководство".

1 Что такое подключённые транспортные средства?

Подключённые транспортные средства являются типичным применением Интернета вещей (IoT). Согласно Гонконгскому институту прикладных научных исследований и технологий, технология подключённых автомобилей относится к системам связи с низкой задержкой между транспортными средствами, пешеходами, дорожной инфраструктурой и облаком. Благодаря обмену информацией в реальном времени внутри таких систем достигается координация между водителями, транспортными средствами и инфраструктурой. Это позволяет своевременно предоставлять пользователям дорог информацию и предупреждения, повышая безопасность и поддерживая системы помощи водителю. Кроме того, технологии подключённых автомобилей поддерживают мониторинг дорожного движения в реальном времени, управление аварийными ситуациями и планирование маршрутов для повышения эффективности транспортного потока. В долгосрочной перспективе они могут поддерживать автономное вождение, помогая выявлять скрытые риски и повышать общую безопасность дорожного движения.

Основные категории связи подключённых транспортных средств приведены в таблице ниже:

Конечная точка связи Техническая реализация Сценарии применения
Транспортное средство – Транспортное средство (V2V) Обмен и совместное использование информации между транспортными средствами, включая данные о положении, скорости и другом состоянии Оценка условий транспортного потока
Транспортное средство – Пешеход (V2P) Пользователи взаимодействуют с транспортными средствами через Wi-Fi, Bluetooth или сотовые сети Позволяет пользователям контролировать и управлять транспортными средствами с мобильных устройств
Транспортное средство – Инфраструктура (V2I) Обмен информацией между транспортными средствами и дорогами через стационарные дорожные средства связи Мониторинг состояния дорожного покрытия и определение оптимальных маршрутов движения
Транспортное средство – Облако (V2C) Транспортные средства передают данные в облачные платформы через спутниковые или сотовые сети Получение команд управления от платформ; обмен данными в реальном времени в облаке
Внутренние устройства транспортного средства Передача данных между внутренними компонентами транспортного средства Мониторинг и управление внутренними устройствами в реальном времени, обеспечение цифровых систем управления в салоне

2 Рекомендации по моделированию данных подключённых транспортных средств

Представьте, что вы разработчик приложений на стороне транспортного средства и отвечаете за управление платформой метрик A вашей компании. Вы хотите спроектировать модель данных для этой платформы в YMatrix. Ваш подход может включать следующие шаги:

Шаг Описание
1 Сбор требований
2 Проектирование и реализация модели
3 Тестирование модели

2.1 Сбор требований

  • Характеристики платформы метрик транспортного средства A:

    • Большой объём данных: масштаб в петабайтах.
    • Большое количество устройств: одновременно может собирать и передавать данные потенциально тысячи датчиков.
    • Метрики транспортного средства: в основном фиксированные, но должна быть возможность динамического расширения.
    • Типы метрик:
      1. Целочисленные (int) метрики: например, уровень заряда батареи, выраженный целыми числами от 0 до 100.
      2. Дробные (float) метрики: например, суммарный пробег.
      3. Логические (boolean) метрики: например, состояние включения/выключения указателя поворота налево.
      4. Текстовые (text) метрики: например, уникальный идентификатор устройства.
  • Шаблоны запросов платформы метрик транспортного средства A:

    • Преимущественно точечные запросы и поиск детальных записей по устройству.

Примечание!
В данном сценарии термин «устройство» означает отдельные датчики на каждом транспортном средстве. Каждый датчик считается одним «устройством».

  • Полный поток данных:

Предварительно вычисленные данные с датчиков на транспортном средстве / телеметрия → Облако → YMatrix → Панель мониторинга

Вывод
После тщательного предварительного анализа мы приходим к выводу, что метрики платформы A в основном детерминированы. Однако следует предусмотреть динамический столбец для учёта будущих или изменяющихся метрик. Учитывая большой объём данных и большое количество устройств, рекомендуется использовать структурированную + полуструктурированную широкую таблицу вариативной модели. В качестве основы для создания таблицы используйте движок хранения MARS3, который обеспечивает высокую степень сжатия.

2.2 Проектирование и реализация модели

2.2.1 Структура таблицы

На основе анализа требований предлагается следующая структура таблицы:

Используйте тип данных MXKV для динамических столбцов. Для создания этого типа необходимо сначала установить расширение.

=# CREATE EXTENSION matrixts;
=# CREATE TABLE V2X ( 
    ts timestamp with time zone, 
    device_id text,
    vehicle_type text,
    longitude float,
    latitude float,
    altitude float,
    speed float,
    left_turn_signal boolean,
    right_turn_signal boolean,
    emergency_flashers boolean,
    power int,
    gas int,
    windshield_wiper boolean,
    mileage float,
    signal_strength text,
    power_mode text,
    control_mode text,
    charging_status text,
    mxkv mxkv_int4
)
USING MARS3
DISTRIBUTED BY (device_id,vehicle_type)
ORDER BY (device_id,ts,vehicle_type)
PARTITION BY range(ts)
(
 START ('2023-01-15') INCLUSIVE 
 END ('2023-01-30') EXCLUSIVE 
 EVERY (interval '1 day'), 
 DEFAULT PARTITION default_p
);

В этом примере:

  • Столбцы меток: device_id, vehicle_type.
  • Столбцы метрик: longitude, latitude, altitude, speed, left_turn_signal, right_turn_signal, emergency_flashers, power, gas, windshield_wiper, mileage, signal_strength, power_mode, control_mode, charging_status — всего пятнадцать.
  • Выше перечислены столбцы структурированных данных; полуструктурированные данные хранятся в столбце mxkv для динамически расширяемых метрик.
  • Поддерживаемые типы метрик: int, float, text, boolean.
  • Ключ распределения: (device_id, vehicle_type).
  • Ключ сортировки: (device_id, ts, vehicle_type).
  • Ключ партиционирования: ts.
  • Одна партиция в день с 2023-01-15 по 2023-01-30.

2.2.2 Тестирование модели

Шаг План тестирования SQL-запрос
1 Просмотр последних 10 записей SELECT * FROM <表名> ORDER BY ts DESC LIMIT 10
2 Запрос общего количества строк SELECT COUNT(*) FROM <表名>
3 Получение всех последних метрик для конкретного устройства SELECT * FROM <表名> WHERE <设备标签列名> = '<设备标签值>' ORDER BY <时间戳列名> DESC LIMIT 1
...

Добавьте 100 тестовых строк для структурированных метрик.

=# INSERT INTO V2X (ts, device_id, vehicle_type, longitude, latitude, altitude, speed, left_turn_signal, right_turn_signal, emergency_flashers, power, gas, windshield_wiper, mileage, signal_strength, power_mode, control_mode, charging_status)
SELECT 
    timestamp '2023-01-15 00:00:00+00' + (random() * (timestamp '2023-01-30 00:00:00+00' - timestamp '2023-01-15 00:00:00+00')) AS ts, 
    'device_' || (random() * 100 + 1)::int AS device_id, 
    CASE (random() * 3)::int 
        WHEN 0 THEN 'car'
        WHEN 1 THEN 'truck'
        WHEN 2 THEN 'motorcycle'
        ELSE 'others'
    END AS vehicle_type, 
    -180 + random() * 360 AS longitude, 
    -90 + random() * 180 AS latitude, 
    random() * 500 AS altitude, 
    random() * 100 AS speed, 
    random() < 0.5 AS left_turn_signal, 
    random() < 0.5 AS right_turn_signal, 
    random() < 0.5 AS emergency_flashers, 
    random() * 100 AS power, 
    random() * 100 AS gas, 
    random() < 0.5 AS windshield_wiper, 
    random() * 10000 AS mileage, 
    CASE (random() * 3)::int 
        WHEN 0 THEN 'low'
        WHEN 1 THEN 'medium'
        WHEN 2 THEN 'high'
        ELSE 'others'
    END AS signal_strength, 
    CASE (random() * 3)::int 
        WHEN 0 THEN 'normal'
        WHEN 1 THEN 'eco'
        WHEN 2 THEN 'sport'
        ELSE 'others'
    END AS power_mode, 
    CASE (random() * 3)::int 
        WHEN 0 THEN 'auto'
        WHEN 1 THEN 'manual'
        ELSE 'others'
    END AS control_mode, 
    CASE (random() * 3)::int 
        WHEN 0 THEN 'not_charging'
        WHEN 1 THEN 'charging'
        WHEN 2 THEN 'charged'
        ELSE 'others'
    END AS charging_status
FROM generate_series(1, 100);

Результаты тестирования:

  1. Просмотр последних 10 записей
=# SELECT * FROM V2X ORDER BY ts DESC LIMIT 10;
              ts               | device_id  | vehicle_type |      longitude      |      latitude      |      altitude      |       speed        | left_turn_signal | right_turn_signal | emergency_flashers | power | gas | 
windshield_wiper |      mileage       | signal_strength | power_mode | control_mode | charging_status | mxkv 
-------------------------------+------------+--------------+---------------------+--------------------+--------------------+--------------------+------------------+-------------------+--------------------+-------+-----+-
-----------------+--------------------+-----------------+------------+--------------+-----------------+------
 2023-01-29 18:26:28.2555+00   | device_7   | others       |    77.7250493925452 | -71.44711665175421 |  470.3520368782552 |  10.08919814806859 | t                | f                 | f                  |    91 |  60 | 
f                | 3335.6115546297715 | medium          | others     | manual       | not_charging    | 
 2023-01-29 09:31:03.475343+00 | device_10  | truck        |  110.79930700971727 |  80.10310285177269 |  363.9362759505627 | 0.8470622257185312 | t                | t                 | f                  |    68 |  59 | 
f                |  8477.632404196207 | high            | normal     | others       | charged         | 
 2023-01-29 08:13:59.117597+00 | device_99  | truck        | -109.73747608981242 | -89.35249080260903 |  48.85333218970267 | 37.727205912382544 | t                | f                 | t                  |    31 |  36 | 
t                |  7473.970943404033 | high            | eco        | others       | charging        | 
 2023-01-29 05:58:26.571911+00 | device_46  | others       |    51.8998425853313 |  88.27679475399947 | 480.07287781433484 | 49.226744573126524 | f                | t                 | f                  |    42 |   4 | 
t                |  7143.216304908968 | high            | sport      | others       | not_charging    | 
 2023-01-29 04:15:40.989367+00 | device_40  | motorcycle   | -155.34683651071745 |  6.175953177055931 |  181.5449423808442 |  50.05742613215105 | f                | f                 | t                  |    85 |  87 | 
f                |  3206.801779860875 | low             | normal     | others       | charging        | 
 2023-01-29 00:00:25.771633+00 | device_100 | truck        |  151.84348070359067 |  61.94081118610583 |  79.71495904976855 |  37.50073341871314 | f                | f                 | f                  |    12 |  63 | 
f                | 3344.5220642645168 | others          | sport      | manual       | not_charging    | 
 2023-01-28 20:35:29.229556+00 | device_29  | motorcycle   |   -90.3624239076261 | -9.007833078214986 | 62.318822164742826 |  20.92006269193405 | t                | t                 | t                  |    27 |  97 | 
f                |  9388.986611159318 | others          | eco        | manual       | charging        | 
 2023-01-28 13:41:36.964772+00 | device_80  | car          | -18.009506474683548 |  64.13247721331942 |  452.8918234900896 | 19.506606969701323 | f                | t                 | t                  |    43 |  62 | 
t                |  9398.868263826578 | low             | normal     | manual       | charging        | 
 2023-01-28 11:12:06.491849+00 | device_55  | car          |     88.971600816884 | -10.29589404625213 |  372.6116487798965 |  68.00809686681362 | f                | f                 | t                  |    21 |  76 | 
f                |  430.6571575941476 | others          | others     | others       | charging        | 
 2023-01-28 09:24:02.536764+00 | device_5   | car          | -5.8755335883314785 | 14.557768126530704 | 351.21329889642715 |  9.202603983735003 | t                | t                 | f                  |     5 |  16 | 
t                | 1403.2798564383952 | others          | sport      | others       | others          | 
(10 rows)
  1. Запрос общего количества строк
=# SELECT COUNT(*) FROM V2X;
 count
-------
   100
(1 row)
  1. Запрос последнего непустого значения конкретной метрики для заданного устройства

Получите последнюю скорость для устройства 5.

=# SELECT last_not_null(speed,ts) AS last_speed FROM V2X WHERE device_id = 'device_10' LIMIT 1;
                       last_speed                       
--------------------------------------------------------
 ["0.8470622257185312","2023-01-29 09:31:03.475343+00"]

Добавьте новую метрику типа MXKV car_length в динамический столбец mxkv, с типом данных mxkv_int4 и значением 350 (единица измерения: см). Перед вставкой, чтобы оптимизировать сжатие и производительность запросов, используйте UDF mxkv_import_keys() для предварительного определения ключа и объявления набора ключей, которые ожидаются в данных.

=# SELECT mxkv_import_keys('{"car_length": 350}');
 mxkv_import_keys
------------------
 car_length
(1 row)

Вставьте данные.

=# INSERT INTO V2X(mxkv) values('{"car_length":350}');
INSERT 0 1

Выполните запрос на вставленную пару ключ-значение.

=# SELECT mxkv->'car_length' as car_length FROM V2X;

Примечание!
Более подробную информацию об использовании MXKV см. в разделе Расширенные типы данных.

Примечание!
Здесь приведены только базовые примеры тестирования. За дополнительными сценариями тестирования обращайтесь к разделу Начало работы в графическом интерфейсе. В рабочих средах разрабатывайте тестовые запросы в соответствии с фактическими требованиями к запросам.