我有一个通过Telegraf收集的测量结果。它具有以下结构:
名称: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
的测量?
答案 0 :(得分:1)
不幸的是,目前无法使用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)
进行查询)
答案 1 :(得分:0)
这并非原始问题的答案,但我发现了Kapacitor的一个特殊技巧。
如果此查询已由kapacitor执行,则它(kapacitor)具有一个特殊的节点default
,该节点可以添加具有某些值的缺失字段/标签。
对于health_ok
查询,它看起来像这样(脚本):
var data = stream
|from()
.measurement('smart_device')
|default()
.field('health_ok', FALSE)
这可以假定如果缺少health_ok,则为FALSE
。