SLS のマップ関数と演算子の構文および使用方法について説明します。
Simple Log Service (SLS) は、以下のマップ関数と演算子に対応しています。
分析文で文字列を使用する場合は、文字列を一重引用符 ('') で囲む必要があります。囲まれていない文字列または二重引用符 ("") で囲まれている文字列は、フィールド名または列名を示します。たとえば、 'status' は「status」という文字列を示し、status または "status" は「status」というフィールドを示します。
|
関数名 |
構文 |
説明 |
SQL |
SPL |
|
[x] |
マップから、角括弧 [] 内で指定されたキーの値を返します。 |
√ |
× |
|
|
cardinality(x) |
マップのカーディナリティ (サイズ) を返します。 |
√ |
× |
|
|
element_at(x, key) |
マップから指定されたキーの値を返します。 |
√ |
√ |
|
|
histogram(x) |
クエリと分析の結果をマップにグループ化します。 |
√ |
× |
|
|
histogram_u(x) |
結果を複数行複数列形式でグループ化します。 |
√ |
× |
|
|
map() |
空のマップを返します。 |
√ |
√ |
|
|
map(x, y) |
2つの配列からマップを作成します。 |
√ |
√ |
|
|
map_agg(x, y) |
x をキー、 y を値としてマップを作成します。y に複数の値がある場合は、いずれか1つがランダムに選択されます。 |
√ |
× |
|
|
map_concat(x, y...) |
複数のマップを1つのマップに結合します。 |
√ |
√ |
|
|
map_filter(x, lambda_expression) |
ラムダ式に基づいてマップ内のエントリをフィルタリングします。 |
√ |
√ |
|
|
map_keys(x) |
マップからすべてのキーを抽出し、配列として返します。 |
√ |
√ |
|
|
map_values(x) |
マップからすべての値を抽出し、配列として返します。 |
√ |
√ |
|
|
multimap_agg(x, y) |
x をキー、 y を値の配列とするマップを作成します。y に複数の値がある場合は、すべて収集されます。 |
√ |
× |
添字演算子
添字演算子は、マップから指定されたキーの値を返します。
構文
[x]
パラメーター
|
パラメーター |
説明 |
|
x |
アクセスするキー。 varchar 型である必要があります。 |
戻り値のデータ型
結果のデータ型は、マップの値の型と同じです。
例
SLS データ変換ログでは、etl_context フィールドはマップ型です。 添字演算子を使用して、etl_context から プロジェクト の値を取得します。
-
フィールド例
etl_context: { project:"datalab-148****6461-cn-chengdu" logstore:"internal-etl-log" consumer_group:"etl-83****4d1965" consumer:"etl-b2d40ed****c8d6-291294" shard_id:"0" } -
クエリと分析文
* | SELECT try_cast(json_parse(etl_context) AS map(varchar, varchar))['project'] -
_col0カラムは、etl_context から抽出されたプロジェクトの値として、datalab-148****6461-cn-chengduを返します。
カーディナリティ関数
カーディナリティ関数は、マップのカーディナリティ (サイズ) を返します。
構文
cardinality(x)
パラメーター
|
パラメーター |
説明 |
|
x |
入力マップ。 |
戻り値のデータ型
bigint
例
histogram 関数でメソッドごとのリクエスト数を集計し、cardinality 関数でユニークなメソッド数をカウントします。
-
クエリと分析文
* | SELECT histogram(request_method) AS request_method, cardinality(histogram(request_method)) AS "kinds" -
クエリと分析結果:
request_methodカラムは{"DELETE":5,"POST":7,"GET":41,"PUT":4}を返し、kindsカラムは4を返します。これはリクエストメソッドが 4 種類であることを示します。
element_at 関数
element_at 関数は、マップから指定したキーの値を返します。
構文
element_at(x, key)
パラメーター
|
パラメーター |
説明 |
|
x |
マップである必要があります。 |
|
key |
マップ内のキー。 |
戻り値のデータ型
結果のデータ型は、マップの値の型と同じです。
例
ヒストグラムを使用してメソッド別にリクエストをカウントし、element_at を使用して DELETE のカウントを取得します。
-
クエリと分析文
* | SELECT histogram(request_method) AS request_method, element_at(histogram(request_method),'DELETE') AS "count" -
クエリと分析結果:request_method カラムは
{"HEAD":686,"DELETE":13619,"POST":34365,"GET":138097,"PUT":34056}を返し、count カラムは13619(DELETE リクエストのカウント) を返します。
ヒストグラム関数
ヒストグラム関数は、 * | SELECT count(*) GROUP BY x と同様に、結果を JSON マップとしてグループ化します。
構文
histogram(x)
パラメーター
|
パラメーター |
説明 |
|
x |
パラメーターには任意のデータ型を指定できます。 |
戻り値のデータ型
マップ
例
ヒストグラムを使用してメソッド別にリクエストをカウントします。
-
クエリと分析文:
* | SELECT histogram(request_method) AS request_method -
結果は
{"HEAD":30,"DELETE":564,"POST":1382,"GET":5420,"PUT":1334}です。GET のカウントが 5,420 で最も多くなっています。
histogram_u 関数
histogram_u 関数はデータをグループ化し、結果を複数行、複数列の形式で返します。
構文
histogram_u(x)
パラメーター
|
パラメーター |
説明 |
|
x |
パラメーターには任意のデータ型を指定できます。 |
戻り値のデータ型
複数行、複数列の形式
例
histogram_u を使用してメソッド別にリクエストをカウントし、結果を縦棒グラフとして表示します。
-
クエリと分析文
*|SELECT histogram_u(request_method) as request_method -
クエリと分析結果

map 関数
map 関数は、空のマップを返すか、2 つの配列からマップを作成します。
構文
-
空のマップを返します。
map() -
2 つの配列からマップを作成します。
map(x, y)
パラメーター
|
パラメーター |
説明 |
|
x |
パラメーターは配列である必要があります。 |
|
y |
パラメーターは配列である必要があります。 |
戻り値のデータ型
map
例
-
例 1: class フィールドと number フィールドは配列です。map 関数を使用して、各 class と学生数のキーと値のマッピングを作成します。
-
サンプルフィールド
class:["class01","class02","class03","class04","class05"] number:[49,50,45,47,50] -
クエリと分析文
* | SELECT map(try_cast(json_parse(class) AS array(varchar)) ,try_cast(json_parse(number) AS array(bigint))) -
クエリと分析結果は
{"class01":49,"class03":45,"class02":50,"class05":50,"class04":47}です。
-
-
例 2: 空のマップを返します。
-
クエリと分析文
* | SELECT map() -
結果は
{}で、空のマップです。
-
map_agg 関数
map_agg 関数は、x と y をマップに集約します。このとき、x はキー、y は値です。y に複数の値がある場合は、いずれか 1 つがランダムに選択されます。
構文
map_agg(x, y)
パラメーター
|
パラメーター |
説明 |
|
x |
データ型は任意です。 |
|
y |
データ型は任意です。 |
戻り値のデータ型
マップ
例
request_method (キー) と request_time (値) をマップに集約します。
-
サンプルフィールド
request_method:POST request_time:80 request_method:GET request_time:51 request_method:HEAD request_time:47 request_method:DELETE request_time:26 request_method:PUT request_time:49 -
クエリと分析ステートメント
* | SELECT map_agg(request_method,request_time) -
クエリと分析結果は
{"HEAD":47.0,"DELETE":26.0,"POST":80.0,"GET":51.0,"PUT":49.0}です。
map_concat 関数
map_concat 関数は、複数のマップを 1 つのマップにマージします。
構文
map_concat(x, y)
パラメーター
|
パラメーター |
説明 |
|
x |
パラメーターはマップである必要があります。 |
|
y |
パラメーターはマップである必要があります。 |
戻り値のデータ型
マップ
例
SLS データ変換ログでは、etl_context と progress はいずれもマップ型です。 map_concat を使用してこれらをマージします。
-
サンプルフィールド
etl_context: { project:"datalab-148****6461-cn-chengdu" logstore:"internal-etl-log" consumer_group:"etl-83****4d1965" consumer:"etl-b2d40ed****c8d6-291294" shard_id:"0" } progress: { accept:3 dropped:0 delivered:3 failed:0 } -
クエリと分析ステートメント
* | SELECT map_concat( cast ( json_parse(etl_context) AS map(varchar, varchar) ), cast (json_parse(progress) AS map(varchar, varchar)) ) -
クエリと分析結果
{"project":"datalab-148****6461-cn-chengdu","logstore":"internal-etl-log","consumer_group":"etl-83****4d1965","consumer":"etl-b2d40ed****c8d6-291294","shard_id":"0","accept":"3","dropped":"0","delivered":"3","failed":"0"}
map_filter 関数
map_filter 関数は、ラムダ式に基づいてマップをフィルタリングします。
構文
map_filter(x, lambda_expression)
パラメーター
|
パラメーター |
説明 |
|
x |
パラメーターはマップである必要があります。 |
|
lambda_expression |
ラムダ式です。詳細については、ラムダ式をご参照ください。 |
戻り値のデータ型
マップ
例
2 つの配列を新しいマップにマッピングし、null 値をフィルタリングして除外します。 式 (k, v) -> v is not null はラムダ式です。
-
クエリと分析文
* | SELECT map_filter(map(array[10, 20, 30], array['a', NULL, 'c']), (k, v) -> v is not null) -
クエリと分析結果は
{"10":"a","30":"c"}です。
map_keys 関数
map_keys 関数は、マップからすべてのキーを抽出し、配列として返します。
構文
map_keys(x)
パラメーター
|
パラメーター |
説明 |
|
x |
パラメーターはマップである必要があります。 |
戻り値のデータ型
配列
例
SLS データ変換ログでは、etl_context フィールドはマップ型です。map_keys を使用して etl_context からすべてのキーを抽出します。
-
サンプルフィールド:
etl_context: { project:"datalab-148****6461-cn-chengdu" logstore:"internal-etl-log" consumer_group:"etl-83****4d1965" consumer:"etl-b2d40ed****c8d6-291294" shard_id:"0" } -
クエリと分析ステートメント:
* | SELECT map_keys(try_cast(json_parse(etl_context) AS map(varchar, varchar))) -
クエリと分析の結果は
["consumer","consumer_group","logstore","project","shard_id"]です。
map_values 関数
map_values 関数は、マップからすべての値を抽出し、配列として返します。
構文
map_values(x)
パラメーター
|
パラメーター |
説明 |
|
x |
パラメーターはマップでなければなりません。 |
戻り値のデータ型
配列
例
SLS のデータ変換ログでは、etl_context フィールドはマップ型です。map_values を使用して、etl_context からすべての値を抽出します。
-
サンプルフィールド
etl_context: { project:"datalab-148****6461-cn-chengdu", logstore:"internal-etl-log", consumer_group:"etl-83****4d1965", consumer:"etl-b2d40ed****c8d6-291294", shard_id:"0" } -
クエリと分析文
* | SELECT map_values(try_cast(json_parse(etl_context) AS map(varchar, varchar))) -
結果として、
etl_context内のすべての値を含む配列["datalab-148****6461-cn-chengdu", "internal-etl-log", "etl-83****4d1965", "etl-b2d40ed****c8d6-291294", "0"]が返されます。
multimap_agg 関数
multimap_agg 関数は、x と y をマップにマッピングします。このマップでは、x がキー、y が値 (配列) です。同じキーに対して複数の y 値が存在する場合、それらはすべて配列にまとめられます。
構文
multimap_agg(x, y)
パラメーター
|
パラメーター |
説明 |
|
x |
任意のデータ型を使用できます。 |
|
y |
任意のデータ型を使用できます。 |
戻り値のデータ型
マップ
例
multimap_agg を使用して、request_method (キー) と request_time (値の配列) を対応付けます。
-
サンプルフィールド
request_method:POST request_time:80 -
クエリと分析文
* | SELECT multimap_agg(request_method,request_time) -
結果では、各 HTTP メソッドが
request_timeの値の配列に対応付けられます。たとえば、DELETE は [28.0, 80.0, 21.0, 54.0, ...] に、POST は [77.0, 27.0, 52.0, 25.0, ...] に対応付けられます。