シナリオ

ログデータの列は通常、文字列や数値などのプリミティブデータ型です。 より複雑なデータ構造を持つ特定のシナリオでは、ログデータの列に、配列、マップ、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 文字列を返します。 例は次となります:
    * | select histogram(method)
    UNNEST 関数を使用して JSON データを複数の行に分割することができます。例は次となります:
    * | 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)