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

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

имя: умное_устройство

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?


person George Shuklin    schedule 10.08.2018    source источник


Ответы (2)


К сожалению, в настоящее время нет возможности сделать это с помощью InfluxQL. InfluxDB — это форма базы данных, ориентированной на документы; это означает, что строки измерения могут иметь разную схему. Следовательно, для поля строки не существует понятия null; на самом деле в этой строке нет поля. например, предположим, что в измерении cost есть 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))

person m.ghoreshi    schedule 11.08.2018

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

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

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

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

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

person George Shuklin    schedule 14.08.2018