Пример моделирования данных в сценарии Интернета транспортных средств

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

  • Первая статья — «Что такое модель данных временных рядов?» — с помощью ответов на несколько глубоких вопросов поможет вам окончательно понять саму концепцию модели данных временных рядов.
  • Вторая статья — «Идеи моделирования временных последовательностей» — попытается предоставить справочные материалы по подходам к проектированию от YMatrix с точки зрения теоретического руководства.
  • Третья и четвертая статьи — это примеры моделирования данных в сценариях Интернета транспортных средств (то есть данный документ) и умного дома. На основе «идей моделирования временных последовательностей» они демонстрируют передовые практики моделирования различных временных сценариев в YMatrix.

Примечание!
Данный материал приведён исключительно в качестве справочного примера. Перед началом проектирования модели рекомендуется внимательно изучить хотя бы Архитектуру YMatrix и принципы работы компонентов. Описание принципов работы компонентов см. в главе «Справочное руководство».

1 Что такое Интернет транспортных средств?

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

Основные категории Интернета транспортных средств следующие:

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

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

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

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

2.1 Исследование требований

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

    • Объём данных огромен: уровень PB.
    • Большое количество устройств: одновременно данные могут собирать и передавать тысячи устройств.
    • Показатели на стороне транспортного средства: относительно фиксированные, но требуется возможность динамического расширения показателей.
    • Типы значений показателей:
      1. Целочисленные показатели: целые числа от 0 до 100 представляют уровень заряда от 0 до 100 % и т.д.
      2. Показатели типа float: общий пробег транспортного средства и т.д.
      3. Логические показатели: состояние переключателя левого указателя поворота и т.д.
      4. Текстовые показатели: уникальный идентификационный номер устройства и т.д.
  • Характеристики запросов платформы показателей транспортных средств A:

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

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

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

Предварительно рассчитанные данные с датчиков / данные трассировки -> Облако -> YMatrix -> Страница мониторинга

Вывод
После тщательного и всестороннего предварительного исследования мы пришли к выводу, что в 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
);

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

  • Столбцы tags — 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;
  • В качестве ключей сортировки используются ts, device_id, vehicle_type;
  • В качестве ключа партиционирования используется ts;
  • Каждый день с 2023-01-15 по 2023-01-30 образует отдельную партицию.

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

Порядковый номер План тестирования SQL-запрос
1 Просмотр последних 10 записей SELECT * FROM <Table Name> ORDER BY ts DESC LIMIT 10
2 Запрос общего количества строк SELECT COUNT(*) FROM <table name>
3 Запрос всех последних показателей, отправленных определённым устройством SELECT * FROM <Table name> WHERE <Device tag column name> = '<Device tag value>' ORDER BY <Timestamp column name> 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)
  2. Запрос общего количества строк
    =# SELECT COUNT(*) FROM V2X;
    count
    -------
    100
    (1 row)
  3. Запрос последнего непустого значения определённого показателя устройства

Проверка последней скорости устройства 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 см. в разделе Расширенные типы данных.

Примечание!
Здесь приведены лишь простые примеры тестирования. Дополнительные примеры тестирования сценариев см. в графическом интерфейсе, раздел Легкое начало работы. В реальной среде разрабатывайте конкретные тестовые запросы в соответствии с конкретными требованиями к запросам.