Работа с разреженными данными временных рядов в InfluxDB - PullRequest
0 голосов
/ 03 марта 2020

Мы храним данные наших устройств IIOT в InfluxDB.

Наши устройства IIOT отправляют только измененные данные. Таким образом, неизмененные данные «не» повторяются большую часть времени.

Пример:

time                 malfunction_status service_status warning_status
----                 ------------------ -------------- --------------
2020-02-27T14:55:38Z 0                  0              0
2020-02-27T14:55:39Z 0                  1              0
2020-02-27T14:55:57Z 1                  0              1
2020-02-27T14:56:08Z 1                  1              1
2020-02-27T14:56:24Z 1                  1              1
2020-02-27T14:57:38Z                    0
2020-02-27T14:57:50Z 0                                 0
2020-02-27T14:57:56Z                    1              1
2020-02-27T14:58:19Z 1                  0              0
2020-02-27T15:01:16Z 0                  1
2020-02-27T15:01:25Z                                   1
2020-02-27T15:01:54Z 1                  0              0
2020-02-27T15:02:34Z 0                                 1
2020-02-27T15:02:52Z 1                  1              0
2020-02-27T15:02:53Z 0                  0              1
2020-03-02T15:33:37Z 0                  0              1
2020-03-02T15:33:57Z                    1
2020-03-02T15:33:58Z 1
2020-03-02T15:35:21Z 0                  0              0
2020-03-02T15:35:38Z                    1              1
2020-03-02T15:35:49Z 1                                 0
2020-03-02T15:35:53Z                    0              1
2020-03-02T15:36:16Z                    1              0
2020-03-03T08:52:40Z 0                  0
2020-03-03T08:53:24Z 1
2020-03-03T08:53:33Z                    1              1
2020-03-03T08:55:16Z                    0              0
2020-03-03T08:55:29Z 0                                 1
2020-03-03T08:55:57Z 1                                 0
2020-03-03T08:56:11Z                    1              1
2020-03-03T08:58:04Z 0
2020-03-03T08:58:35Z                                   0
2020-03-03T09:02:37Z 1                  0              1
2020-03-03T09:02:52Z 0                  1              0
2020-03-03T09:03:02Z 1                  0              1
2020-03-03T09:03:06Z 0                                 0
2020-03-03T09:03:37Z 1                  1              1
2020-03-03T09:04:42Z                                   0
2020-03-03T09:04:45Z 0                  0
2020-03-03T09:05:04Z 1
2020-03-03T09:05:15Z                    1              1
2020-03-03T09:06:26Z 0                  0              0

Кажется невозможным найти все вхождения каждого _status, являющегося '0', с помощью простого query.

select / _status / из iot_data, где mId = 'sim_az1_0' и malfunction_status = 0 и service_status = 0 и warning_status = 0

дает только те строки, которые имеют конкретные значения '0' для каждого статуса.

time                 malfunction_status service_status warning_status
----                 ------------------ -------------- --------------
2020-02-27T14:55:38Z 0                  0              0
2020-03-02T15:35:21Z 0                  0              0
2020-03-03T09:06:26Z 0                  0              0

Как минимум результат:

2020-03-03T09:04:42Z                                   0
2020-03-03T09:04:45Z 0                  0

для 2020-03-03T09: 04: 45Z отсутствует.

Это будет только последний вариант - заполнить все значения столбцов при вставке данных в Influx, когда мы записываем сотни столбцов.

В настоящее время я должен был бы выбрать поля из Influx и оценить их за пределами выбора.

Элегантное решение с притоком запросов?

Спасибо!

1 Ответ

0 голосов
/ 07 марта 2020

Дельта-кодирование, которое вы используете, является эффективным способом отправки данных, которые очень мало меняются от точки к точке, но возникает вопрос о том, какие временные метки вы на самом деле ищете. Кодирование данных подразумевает, что существуют не только метки времени, но и промежутки времени, где все три статуса равны 0. Вы можете использовать подзапрос с функцией группировки времени и заполнения, чтобы создать серию с равномерным интервалом времени и без нуля. Если вы используете период времени, который меньше ожидаемого интервала, вы не должны терять ни одно из ваших целевых значений:

select ms, ss, ws from 
(select min(malfunction_status) as ms, min(service_status) as ss, min(warning_status) as ws from iot_data where mId='sim_az1_0' group by time(1s) fill(previous))
where ms=0 and ss=0 and ms=0

Конечно, это даст вам много 1-секундных отметок времени в строка для каждого «вхождения» всех нулевых статусов.

https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/#group по временным интервалам и заполнению https://docs.influxdata.com/influxdb/v1.7/query_language/functions/#difference

...