3

我有一个由电报收集的测量结果。它具有以下结构:

名称:智能设备

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    

但是当我尝试用 empty 过滤掉记录时health_ok,我得到空输出:

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

如何选择空的测量值(否?空?)health_ok

4

2 回答 2

3

不幸的是,目前没有办法使用 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)

于 2018-08-11T11:43:35.930 回答
0

这不完全是原始问题的答案,但我为 Kapacitor 找到了一个特殊的技巧。

如果此查询已由 kapacitor 执行,它 (kapacitor) 有一个特殊节点default,允许添加具有某些值的缺失字段/标签。

对于health_ok查询,它将如下所示(tickscript):

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

这允许假设如果 health_ok 丢失,它是FALSE.

于 2018-08-14T15:22:53.103 回答