実施環境: Splunk Free 8.2.2
0. 概要
Splunk では対象のフィールドに値が入っていない場合、 NULL として扱われます。
この NULL は、空文字列や 0 とは明確に別のものです。
今回は集計処理においてこの NULL を処理した場合の挙動について紹介していきます。
1. 使用するデータ
今回は、以下のデータをもとに確認していきます。
| makeresults count=3
| streamstats count AS CNT
| eval NULL = if( CNT == 1, null(), CNT),
EMPTY = if( CNT == 2, "", CNT),
ZERO = if( CNT == 3, 0, CNT)
| fields - CNT, _time
EMPTY | NULL | ZERO |
---|---|---|
1 | (NULL) | 1 |
(空文字列) | 2 | 2 |
3 | 3 | 0 |
2. 集計値に使用した場合
集計値に NULL を使用した場合、集計は NULL を除外したデータを母集団として行われます。
例えば下記の例の avg(NULL) の場合、 NULL 値の1行目は母集団から除外され、2行目と3行目のみで平均値をとって(2+3)÷2=2.5となります。
空文字列の場合も同様です。
| makeresults count=3
| streamstats count AS CNT
| eval NULL = if( CNT == 1, null(), CNT),
EMPTY = if( CNT == 2, "", CNT),
ZERO = if( CNT == 3, 0, CNT)
| fields - CNT, _time
| stats avg(NULL), avg(EMPTY), avg(ZERO)
3. 集計キーに使用した場合( stats コマンド)
集計キーとして stats コマンドの BY 句や chart コマンドの OVER 句に指定した場合、指定した項目のうち1つでも NULL であるデータは集計の対象から除外されます。
一方で空文字列であるデータは集計の対象に含まれます。
下記の例でも1行目の NULL を含むデータは集計に含まれていませんが、2行目の空文字列を含むデータは問題なく集計されています。
| makeresults count=3
| streamstats count AS CNT
| eval NULL = if( CNT == 1, null(), CNT),
EMPTY = if( CNT == 2, "", CNT),
ZERO = if( CNT == 3, 0, CNT)
| fields - CNT, _time
| stats count BY NULL, EMPTY, ZERO
4. 集計キーに使用した場合( chart , timechart コマンド)
集計キーとして chart コマンドや timechart コマンドの BY 句に指定した場合は、 stats コマンドと異なり NULL 値も集計対象に含まれ、列名は「 NULL 」となります。
空文字列も同様に集計対象に含まれ、こちらは列名は「 VALUE 」となります。
下記の例でも NULL 、空文字ともに集計されていることがわかります。
| makeresults count=3
| streamstats count AS CNT
| eval NULL = if( CNT == 1, null(), CNT)
| fields - CNT
| timechart span=1h count BY NULL
| makeresults count=3
| streamstats count AS CNT
| eval EMPTY = if( CNT == 2, "", CNT)
| fields - CNT
| timechart span=1h count BY EMPTY
5. 集計キーに使用した場合( chart , timechart コマンド/オプション使用)
集計キーとして chart コマンドや timechart コマンドの BY 句に指定した場合、オプションを使用して NULL 値の処理を変更することが可能です。
usenull オプションを false に指定すると、 NULL 値が集計対象から除外されます(デフォルトは true )。
| makeresults count=3
| streamstats count AS CNT
| eval NULL = if( CNT == 1, null(), CNT)
| fields - CNT
| timechart usenull=false span=1h count BY NULL
nullstr オプションに文字列を指定すると、その文字列が NULL 値の列名に使用されます。
| makeresults count=3
| streamstats count AS CNT
| eval NULL = if( CNT == 1, null(), CNT)
| fields - CNT
| timechart nullstr="なし" span=1h count BY NULL