概要
InfluxDBは著名な時系列DBの一つですが、RDBと違いテーブル作成式や条件式に 「is NULL」「is not NULL」が使用できない といった問題があります。
したがってデータを追加していくと、「SELECTした結果の値が一部空白である」といった事態が頻発します。
ここでInfluxDB-Pythonを使ってDataFrame形式で取得した場合は、dropnaメソッドで取得データから不要な行を取り除くことはできるでしょう。
しかしそれだと、無駄な通信量およびCPUリソースを「空フィールドの行を弾く」ためだけに浪費してしまいます。
この問題は昔から言われているもので、StackOverFlowでもInfluxDBのIssuesでも何度か取り上げられました。しかし、結局「fillキーワードで空白フィールドを埋めてから弾く」といった結論に……。
- select from InfluxDB where value is null
- Add boolean operator to check for null values (and its inverse, i.e. not null)
- Search non existent field values
- TL;DR InfluxDB Tech Tips – Eliminate Blank Field Values in Query Results & More!
ただ、「空白フィールドを埋めてから弾く」は直感的ではない上に高コストと思われるため、より良い解法が求められてきました。
解決法あの空白部分はNULLではなくNaNだと考えれば解けます。つまり、「自分自身と等しくない値はNaNだけ」という有名な性質を利用するのです。
// 全レコードの全データを取得
SELECT * FROM measurement1
// column1が空白ではない行だけ取得(Influx公式が推す手法)
SELECT * FROM (SELECT * FROM measurement1 fill(-1)) WHERE column1 != -1
// column1が空白な行だけ取得(Influx公式が推す手法)
SELECT * FROM (SELECT * FROM measurement1 fill(-1)) WHERE column1 = -1
// column1が空白ではない行だけ取得(提案法)
SELECT * FROM measurement1WHERE column1 = column1
// column1が空白な行だけ取得(提案法)
SELECT * FROM measurement1WHERE (column1 = column1) = false
なおこの方法の検証には、Mac OS上でInfluxDB v1.7.1を使用しました。
また、フィールドじゃなくてタグについてis NULLしたい場合も同様に「tag1 = tag1
」「(tag1 = tag1) = false
」で絞り込めます。
- 閲覧数 1735
コメントを追加