Как сделать запрос из базы данных influx с отсутствующим полем?

У меня есть замер, собранный телеграфом. Он имеет следующую структуру:

имя: smart_device

fieldKey    fieldType
--------    ---------
exit_status integer
health_ok   boolean
read_error_rate integer
seek_error_rate integer
temp_c      integer
udma_crc_errors integer

Когда я запрашиваю эту базу данных, я могу сделать следующее:

> select  * from smart_device where  "health_ok" = true limit 1
name: smart_device
time            capacity    device  enabled exit_status health_ok   host    model           read_error_rate seek_error_rate serial_no   temp_c  udma_crc_errors wwn
----            --------    ------  ------- ----------- ---------   ----    -----           --------------- --------------- ---------   ------  --------------- ---
15337409500 2000398934016   sda Enabled     0           true        osd21   Hitachi HDS722020ALA330    0        0       JK11A4B8JR2EGW  38  0       5000cca222e6384f

и это:

> select  * from smart_device limit 1
name: smart_device
time            capacity    device  enabled exit_status health_ok   host    model   read_error_rate seek_error_rate serial_no   temp_c  udma_crc_errors wwn
----            --------    ------  ------- ----------- ---------   ----    -----   --------------- --------------- ---------   ------  --------------- ---
1533046990                   sda            0                      osd21    

Но когда я пытаюсь отфильтровать записи с пустым health_ok, я получаю пустой вывод:

> select  * from smart_device where "health_ok"!= true 
> 

Как выбрать измерения с пустым (нет? Нулевым?) health_ok?

2
0
2 025
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

К сожалению, в настоящее время это невозможно сделать с помощью InfluxQL. InfluxDB - это форма документно-ориентированной базы данных; это означает, что строки измерения могут иметь разную схему. Следовательно, нет понятия null для поля строки; на самом деле эта доза строки не имеет поля. например, предположим, что в измерении Стоимость есть 4 строки

> select * from cost
name: cost
time                isok type value
----                ---- ---- -----
1533970927859614000 true 1    100
1533970938243629700 true 2    101
1533970949371761100      3    103
1533970961571703900      2    104

Как видите, есть две строки с isok=true и две строки, в которых нет поля с именем isok; поэтому есть только один способ выбрать время строк, в которых есть поле isok, с помощью этого запроса:

> select isok from cost
name: cost
time                isok
----                ----
1533970927859614000 true
1533970938243629700 true

Поскольку InfluxQL в настоящее время не поддерживает подзапрос в предложении where, поэтому нет способа запрашивать строки без поля isok (если InfluxDB поддерживает этот тип запроса, вы можете запросить, как этот SELECT * FROM cost WHERE time NOT IN (SELECT isok FROM cost))

Это не совсем ответ на исходный вопрос, но я нашел особый трюк для Kapacitor.

Если этот запрос был выполнен kapacitor, он (kapacitor) имеет специальный узел default, который позволяет добавлять недостающие поля / теги с некоторым значением.

Для запроса health_ok это будет выглядеть так (тиковый скрипт):

var data = stream
    |from()
      .measurement('smart_device')
        |default()   
           .field('health_ok', FALSE)

Это позволяет предположить, что если пропущено health_ok, то это FALSE.

Другие вопросы по теме