InfluxDBで、簡単に空フィールドを含む行を弾く手段を発見しました

  •  
 
トビウオ2018年11月20日 - 13:37 に投稿

タグ

概要

InfluxDBは著名な時系列DBの一つですが、RDBと違いテーブル作成式や条件式に 「is NULL」「is not NULL」が使用できない といった問題があります。
したがってデータを追加していくと、「SELECTした結果の値が一部空白である」といった事態が頻発します。

ここでInfluxDB-Pythonを使ってDataFrame形式で取得した場合は、dropnaメソッドで取得データから不要な行を取り除くことはできるでしょう。
しかしそれだと、無駄な通信量およびCPUリソースを「空フィールドの行を弾く」ためだけに浪費してしまいます。

この問題は昔から言われているもので、StackOverFlowでもInfluxDBのIssuesでも何度か取り上げられました。しかし、結局「fillキーワードで空白フィールドを埋めてから弾く」といった結論に……。

ただ、「空白フィールドを埋めてから弾く」は直感的ではない上に高コストと思われるため、より良い解法が求められてきました。

解決法

あの空白部分は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」で絞り込めます。

コメントを追加

プレーンテキスト

  • HTMLタグは利用できません。
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。