Этот документ является третьей главой руководства «Моделирование временных данных». Компания YMatrix считает, что проектирование моделей данных напрямую влияет на ценность потребления и использования данных. Поэтому помимо технического описания мы посвящаем всю главу тому, чтобы дать вам четкое понимание концепции, применения и разработки модели временных рядов.
Примечание!
Данный материал приведён исключительно в качестве справочного примера. Перед началом проектирования модели рекомендуется внимательно изучить хотя бы Архитектуру YMatrix и принципы работы компонентов. Описание принципов работы компонентов см. в главе «Справочное руководство».
Интернет транспортных средств — один из типичных сценариев применения Интернета вещей (IoT). Согласно Гонконгскому институту прикладных наук и технологий Китая, Интернет транспортных средств представляет собой систему низколатентной связи между транспортными средствами, между транспортными средствами и пешеходами, между транспортными средствами и дорожной инфраструктурой, а также между транспортными средствами и облаком. Благодаря передаче информации в реальном времени в системе Интернета транспортных средств люди, транспортные средства и дорожная инфраструктура могут координировать и взаимодействовать друг с другом, а состояние дороги оперативно сообщается и предупреждается для пользователей дорог, тем самым повышая безопасность дорожного движения и поддержку водителя. В то же время технологии Интернета транспортных средств могут применяться для мониторинга дорожного движения в реальном времени, управления авариями и планирования маршрутов движения, что способствует повышению эффективности транспортного потока. В долгосрочной перспективе Интернет транспортных средств может взаимодействовать с развитием технологий автономного вождения, помогая автономному вождению выявлять скрытые риски и повышать безопасность дорожного движения.
Основные категории Интернета транспортных средств следующие:
| Терминал связи | Техническая реализация | Сценарии применения |
|---|---|---|
| Транспортные средства и транспортные средства | Обмен информацией и совместное использование данных между транспортными средствами, включая информацию о состоянии транспортного средства, такую как местоположение и скорость движения | Оценка дорожной обстановки |
| Транспортные средства и пешеходы | Пользователи могут обмениваться информацией с транспортными средствами с помощью беспроводных технологий связи, таких как Wi-Fi, Bluetooth и сотовая связь | Позволяет пользователям контролировать и управлять транспортным средством через соответствующие мобильные устройства |
| Транспортные средства и дорожная инфраструктура | Использование стационарных средств связи на дорожной поверхности для обеспечения обмена информацией между транспортными средствами и дорогой | Мониторинг дорожной обстановки и направление транспортных средств по оптимальному маршруту |
| Транспортные средства и облако | Транспортные средства осуществляют передачу данных с платформами сервисов Интернета транспортных средств с помощью беспроводных технологий, таких как спутниковая или сотовая связь | Транспортные средства принимают управляющие команды от платформы; оперативный обмен данными транспортных средств в облаке |
| Между устройствами внутри автомобиля | Передача данных между оборудованием внутри транспортного средства | Оперативный контроль состояния оборудования и управление его работой для создания цифровой системы управления в автомобиле |
Можно представить, что вы являетесь разработчиком автомобильного приложения и отвечаете за управление и поддержку платформы показателей транспортных средств A в вашей компании. Теперь вы хотите выполнить моделирование и проектирование бизнес-логики этой платформы в YMatrix. Возможные шаги следующие:
| Порядковый номер | Шаг |
|---|---|
| 1 | Исследование требований |
| 2 | Проектирование и реализация модели |
| 3 | Тестирование модели |
Характеристики данных платформы показателей транспортных средств A:
Характеристики запросов платформы показателей транспортных средств A:
Примечание!
В данном сценарии семантика «устройства» относится к различным датчикам каждого транспортного средства — каждый датчик называется «устройством».
Предварительно рассчитанные данные с датчиков / данные трассировки -> Облако -> YMatrix -> Страница мониторинга
Вывод
После тщательного и всестороннего предварительного исследования мы пришли к выводу, что в YMatrix показатели платформы A являются высокоструктурированными, однако всё же требуется наличие динамического столбца для гибкого добавления новых или изменяющихся показателей. Учитывая большой объём данных и большое количество устройств, следует использовать вариант широкой таблицы структурированных + полуструктурированных данных и выбрать механизм хранения MARS3 с хорошей степенью сжатия в качестве основы для создания таблицы.
На основе результатов анализа требований пример проектирования структуры таблицы следующий:
Для динамических столбцов можно выбрать тип данных 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
);
В этом примере:
2023-01-15 по 2023-01-30 образует отдельную партицию.| Порядковый номер | План тестирования | 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);
Результаты тестирования:
=# 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)
=# SELECT COUNT(*) FROM V2X;
count
-------
100
(1 row)
Проверка последней скорости устройства 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 см. в разделе Расширенные типы данных.
Примечание!
Здесь приведены лишь простые примеры тестирования. Дополнительные примеры тестирования сценариев см. в графическом интерфейсе, раздел Легкое начало работы. В реальной среде разрабатывайте конкретные тестовые запросы в соответствии с конкретными требованиями к запросам.