Splunk: マルチバリューと通常の値を変換するコマンド、関数まとめ


###### 実施環境： Splunk Free 8.2.2

### 0. 概要

 Splunk には、マルチバリューという概念があります。
マルチバリューとは、1つのデータの1つの項目について、複数の値を持つことです。
「複数の値を合成した単一の値」ではなく、あくまで「それぞれ別々である複数の値」であるため、検索や集計において少々変わった動きを見せることがあります。

![WS000346.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b531abb7-6905-ee39-6c7b-c849691fe269.jpeg "イメージ図")

今回はこのマルチバリューについて、通常の値とマルチバリューの変換に使用する代表的なコマンド、関数をまとめて紹介します。

### 1. 単一の値 ⇒ マルチバリュー

###### 1.1. makemv

 makemv コマンドは、単一の文字列を区切り文字で分割してマルチバリューに変換するコマンドです。
区切り文字はパラメータで指定できます。
文法は以下の通りです。

 makemv delim="<区切り文字>" <変換するフィールド>

```Splunk:Splunk
| makeresults count=1
| eval TEST = "1,2,3,4,5"
| makemv delim="," TEST
```

![WS000276.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/2c35e11e-fd54-ef1b-a725-9075edefceeb.jpeg "makemv")

![WS000386.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/a4b1c689-b497-63c7-0b7a-fb566da1c236.jpeg "makemv_イメージ")

###### 1.2. split

 split 関数は、単一の文字列を区切り文字で分割してマルチバリューに変換する関数です。
区切り文字はパラメータで指定できます。
文法は以下の通りです。

 split(<変換するフィールド>, "<区切り文字>")

```Splunk:Splunk
| makeresults count=1
| eval TEST = "1,2,3,4,5"
| eval TEST_SPLIT = split(TEST, ",")
```

![WS000286.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8af7349c-d576-d96f-8274-7046d224c394.jpeg "split")

![WS000385.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/4a0ade7a-207a-6424-cf0e-a37feca603f7.jpeg "split_イメージ")

### 2. 複数のデータにまたがる値 ⇒ マルチバリュー

###### 2.1. mvcombine

 mvcombine コマンドは、複数のデータにまたがる値を結合してマルチバリューに変換するコマンドです。
指定したフィールド以外のフィールドを適宜グループ化した上で、指定したフィールドの値をグループごとに結合してマルチバリューに変換します。
文法は以下の通りです。

 mvcombine <変換するフィールド>

```Splunk:Splunk
| makeresults count=5
| streamstats count AS CNT
| eval TEST = CNT % 2
| mvcombine CNT
```

![WS000277.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/963600bf-1e36-4d11-659f-9db17b2d8121.jpeg "mvcombine")

![WS000381.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/0aabaa98-3a11-86dc-3c6d-e4cdf30f45e8.jpeg "mvcombine_イメージ")

### 3. 複数のフィールドまたは固定の値 ⇒ マルチバリュー

###### 3.1. mvappend

 mvappend 関数は、複数のフィールドや固定の値を結合してマルチバリューに変換する関数です。
マルチバリューを結合に含めることも可能です。
文法は以下の通りです。

 mvappend(<値1>,<値2>,...)

```Splunk:Splunk
| makeresults count=1
| eval TEST = mvappend("1","2","3")
| eval TEST = mvappend(TEST,"4","5")
```

![WS000283.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/3cf87698-0fd1-80fb-a835-92a271aa2f97.jpeg "mvappend")

### 4. マルチバリュー ⇒ 単一の値

###### 4.1. nomv

 nomv コマンドは、マルチバリューを単一の文字列に変換するコマンドです。
区切り文字は`\n`です。
文法は以下の通りです。

 nomv <変換するフィールド>

```Splunk:Splunk
| makeresults count=5
| streamstats count AS CNT
| eval TEST = CNT % 2
| mvcombine CNT
| nomv CNT
```

![WS000280.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/16ab61cc-4150-d35a-0c7a-9f067a2333b8.jpeg "nomv")

![WS000383.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/db3e86cb-a0e6-ec21-87dc-97eab38fcf18.jpeg "nomv_イメージ")

なお、きわめて特殊なパターンではありますが、 mvcombine コマンドの直後に nomv コマンドをつなげた場合に限っては、「 mvcombine コマンドの」 delim パラメータに区切り文字を指定することにより`\n`以外の区切り文字を nomv コマンドで用いることが可能です。

```Splunk:Splunk
| makeresults count=5
| streamstats count AS CNT
| eval TEST = CNT % 2
| mvcombine delim="," CNT
| nomv CNT
```

![WS000282.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/1c4df108-ab80-f1f1-2b6f-72b2670b88a3.jpeg "nomv+mvcombine")

###### 4.2. mvjoin

 mvjoin 関数は、マルチバリューを単一の文字列に変換する関数です。
区切り文字はパラメータで指定できます。
文法は以下の通りです。

 mvjoin(<変換するフィールド>, "<区切り文字>")

```Splunk:Splunk
| makeresults count=1
| eval TEST = mvappend("1","2","3")
| eval TEST = mvappend(TEST,"4","5")
| eval TEST_JOIN = mvjoin(TEST, ",")
```

![WS000284.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e7be961b-e01e-cb8b-9507-6ef63e745be0.jpeg "mvjoin")

![WS000384.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/9dc7b36e-8f61-21c4-48ef-62ca42ce65e7.jpeg "mvjoin_イメージ")

### 5. マルチバリュー ⇒ 複数のデータにまたがる値

###### 5.1. mvexpand

 mvexpand コマンドは、マルチバリューを複数のデータにまたがって分割するコマンドです。
指定したフィールド以外のフィールドは、分割後のデータにそれぞれ値がコピーされる形となります。
文法は以下の通りです。

 mvexpand <変換するフィールド>

```Splunk:Splunk
| makeresults count=5
| streamstats count AS CNT
| eval TEST = CNT % 2
| mvcombine CNT
| mvexpand CNT
```

![WS000278.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/01689d1d-2c19-f451-28bb-a41e0faf0ebc.jpeg "mvexpand")

![WS000382.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/009cee84-1bc1-be02-2222-89c7249f6b32.jpeg "mvexpand_イメージ")