シナリオ
ログデータの列は通常、文字列や数値などのプリミティブデータ型です。 より複雑なデータ構造を持つ特定のシナリオでは、ログデータの列に、配列、マップ、JSON オブジェクトなどの複雑なデータ型が含まれることがあります。 このような特別なログフィールドに対して、より簡単に検索と分析を実行するため、 UNNEST 関数を使用できます。
例:
__source__: 1.1.1.1
__tag__:__hostname__: vm-req-170103232316569850-tianchi111932.tc
__topic__: TestTopic_4
array_column: [1,2,3]
double_column: 1.23
map_column: {"a":1,"b":2}
text_column: Product
array_column
フィールドは配列型です。 array_column
配列内のすべての要素の集計を取得するには、各行について配列のすべての要素を列挙する必要があります。
UNNEST 関数
構文 | 説明 |
---|---|
unnest(array) as table_alias(column_name) |
指定された配列を複数の行に分割します。 行の名前は、column_name となります。
|
unnest(map) as table(key_name, value_name) |
指定されたマップを複数の行に分割します。 Key の名前は key_name で、Value の名前は value_name となります。
|
注 注:UNNEST 関数は array 型や、map 型だけを受け入れます。 string 型を指定した場合、まず JSON 型に変換し、
cast(json_parse(array_column) as array(bigint))
構文を使用して、array 型や map 型に変換する必要があります。
配列の要素の列挙
SQL を使用して配列を複数の行に分割します:
* | select array_column, a from log, unnest( cast( json_parse(array_column) as array(bigint) ) ) as t(a)
UNNEST 関数は、配列を複数の行に分割し、各行を t と名づけた新しいテーブルに保存します、そして展開された列を参照するために a を使用します。
- 配列内の要素の合計を計算します:
* | select sum(a) from log, unnest( cast( json_parse(array_column) as array(bigint) ) ) as t(a)
- a(配列の各要素)を使って配列に対して GROUP BY 操作を実行します。
* | select a, count(1) from log, unnest( cast( json_parse(array_column) as array(bigint) ) ) as t(a) group by a
map の要素を列挙する
- map の要素を列挙する:
* | select map_column , a,b from log, unnest( cast( json_parse(map_column) as map(varchar, bigint) ) ) as t(a,b)
- キーで map に対して GROUP BY 操作を実行します。
* | select key, sum(value) from log, unnest( cast( json_parse(map_column) as map(varchar, bigint) ) ) as t(key,value) GROUP BY key
ヒストグラム、numeric_histogram 検索の結果を可視化する
- ヒストグラム
ヒストグラム関数は、COUNT GROUP BY 構文に似ています。 構文の詳細については、マッピング関数を参照してください。
ヒストグラム関数は通常、直接可視化できない JSON 文字列を返します。 例は次となります:UNNEST 関数を使用して JSON データを複数の行に分割することができます。例は次となります:* | select histogram(method)
* | select key , value from( select histogram(method) as his from log) , unnest(his ) as t(key,value)
- Numeric_histogram
numeric_histogram 構文は、数値列の値を複数のバケットにソートします。 この操作は、数値列に対して GROUP BY 操作を実行するのと似ています。 構文の詳細については、推定関数を参照してください。
* | select numeric_histogram(10,Latency)
結果を可視化するには、次の検索ステートメントを使用します:* | select key,value from(select numeric_histogram(10,Latency) as his from log) , unnest(his) as t(key,value)