このトピックでは、配列関数と演算子の基本的な構文と例について説明します。
Log Service は、次の配列関数と演算子をサポートしています。
|
関数名 |
構文 |
説明 |
SQL |
SPL |
|
[x] |
配列のインデックス x にある要素を返します。 これは |
√ |
× |
|
|
array_agg(x) |
x 内のすべての値の配列を返します。 |
√ |
× |
|
|
array_distinct(x) |
配列から重複する要素を削除します。 |
√ |
√ |
|
|
array_except(x, y) |
2つの配列の差集合を返します。 |
√ |
√ |
|
|
array_intersect(x, y) |
2つの配列の積集合を返します。 |
√ |
√ |
|
|
array_join(x, delimiter) |
指定されたデリミタを使用して、配列の要素を文字列に結合します。 null 要素は無視されます。 重要
array_join 関数は最大 1 KB の結果を返します。 制限を超えたデータは切り捨てられます。 |
√ |
√ |
|
|
array_join(x, delimiter, null_replacement) |
指定されたデリミタを使用して、配列の要素を文字列に結合します。 null 要素は null_replacement の値に置き換えられます。 重要
array_join 関数は最大 1 KB の結果を返します。 制限を超えたデータは切り捨てられます。 |
√ |
√ |
|
|
array_max(x) |
配列内の最大値を返します。 |
√ |
√ |
|
|
array_min(x) |
配列内の最小値を返します。 |
√ |
√ |
|
|
array_position(x, element) |
指定された要素の1から始まるインデックスを返します。 要素が存在しない場合は 0 を返します。 |
√ |
√ |
|
|
array_remove(x, element) |
配列から指定された要素を削除します。 |
√ |
√ |
|
|
array_sort(x) |
配列の要素を昇順にソートします。 null 要素は末尾に配置されます。 |
√ |
√ |
|
|
array_transpose(x) |
行と列を入れ替えることで、2次元配列 (配列の配列) を転置します。 |
√ |
× |
|
|
array_union(x, y) |
2つの配列の和集合を返します。 |
√ |
× |
|
|
cardinality(x) |
配列内の要素の数を返します。 |
√ |
√ |
|
|
concat(x, y…) |
複数の配列を1つの配列に連結します。 |
√ |
× |
|
|
contains(x, element) |
配列に指定された要素が含まれている場合は |
√ |
× |
|
|
element_at(x, y) |
配列のインデックス y にある要素を返します。 |
√ |
× |
|
|
filter(x, lambda_expression) |
ラムダ式を使用して配列をフィルター処理し、式を満たす要素のみを返します。 |
√ |
√ |
|
|
flatten(x) |
2次元配列を1次元配列に変換します。 |
√ |
× |
|
|
reduce(x, lambda_expression) |
ラムダ式を要素に適用して、配列を単一の値にリデュースします。 |
√ |
√ |
|
|
reverse(x) |
配列内の要素の順序を逆にします。 |
√ |
√ |
|
|
sequence(x, y) |
指定された範囲内で連続的に増加する値の配列を返します。 デフォルトのステップは 1 です。 |
√ |
√ |
|
|
sequence(x, y, step) |
カスタムステップを使用して、指定された範囲内で連続的に増加する値の配列を返します。 |
√ |
√ |
|
|
shuffle(x) |
配列の要素をシャッフルします。 |
√ |
√ |
|
|
slice(x, start, length) |
配列のサブセットを返します。 |
√ |
√ |
|
|
transform(x, lambda_expression) |
ラムダ式を使用して配列内の各要素を変換します。 |
√ |
√ |
|
|
zip(x, y...) |
複数の配列を1つの2次元配列にマージします。 入力配列の同じインデックスにある要素が新しいサブ配列を形成します。 |
√ |
√ |
|
|
zip_with(x, y, lambda_expression) |
ラムダ式を対応する要素の各ペアに適用して、2つの配列を1つの配列にマージします。 |
√ |
× |
添字演算子
添字演算子は、配列内のインデックス x にある要素を返します。 これは element_at 関数と同じです。
構文
[x]
パラメーター
|
パラメーター |
説明 |
|
x |
配列から取得する要素の1から始まるインデックス。 値は |
戻り値の型
戻り値は、配列要素と同じデータの型です。
例
この例では、number フィールドから最初の要素を返します。
-
フィールド例
number:[49,50,45,47,50] -
クエリ文
* | SELECT cast(json_parse(number) as array(bigint)) [1] -
クエリは
49を返します。
Array_agg 関数
array_agg 関数は、x 内のすべての値の配列を返します。
構文
array_agg (x)
パラメーター
|
パラメーター |
説明 |
|
x |
パラメーターは任意のデータの型にすることができます。 |
戻り値の型
array
例
status フィールドの値を配列として返します。
-
クエリ文
* | SELECT array_agg(status) AS array -
クエリ結果: array フィールドには、HTTP ステータスコード (200、202、204、303、304、401、402、501 など) の配列が含まれます。
Array_distinct 関数
配列から重複する要素を削除します。
構文
array_distinct(x)
パラメーター
|
パラメーター |
説明 |
|
x |
配列である必要があります。 |
戻り値の型
array
例
number フィールドから重複する要素を削除します。
-
フィールド例
number:[49,50,45,47,50] -
クエリ文
*| SELECT array_distinct(cast(json_parse(number) as array(bigint))) -
クエリ結果は
[49,50,45,47]です。 元の配列から重複要素 50 が削除されます。
array_except 関数
array_except 関数は、2つの配列の差集合を返します。
構文
array_except(x, y)
パラメーター
|
パラメーター |
説明 |
|
x |
配列である必要があります。 |
|
y |
配列である必要があります。 |
戻り値の型
array
例
配列 [1,2,3,4,5] と [1,3,5,7] の差集合を計算します。
-
クエリ文
* | SELECT array_except(array[1,2,3,4,5],array[1,3,5,7]) -
クエリは
[2,4]を返します。
array_intersect 関数
2つの配列の積集合を計算します。
構文
array_intersect(x, y)
パラメーター
|
パラメーター |
説明 |
|
x |
配列。 |
|
y |
配列。 |
戻り値の型
array
例
配列 [1,2,3,4,5] と [1,3,5,7] の積集合を計算します。
-
クエリと分析文
* | SELECT array_intersect(array[1,2,3,4,5],array[1,3,5,7]) -
クエリと分析結果は
[1,3,5]です。
array_join 関数
指定されたデリミタを使用して、配列要素を文字列に連結します。
構文
-
デリミタを使用して配列要素を文字列に連結します。 null 要素は無視されます。
array_join(x, delimiter) -
デリミタを使用して配列要素を文字列に連結します。 null 要素を null_replacement に置き換えます。
array_join(x, delimiter,null_replacement)
パラメーター
|
パラメーター |
説明 |
|
x |
入力配列。 |
|
delimiter |
配列要素を区切るために使用される文字列。 |
|
null_replacement |
null 要素を置き換えるために使用される文字列。 |
戻り値の型
varchar。
例
この例では、配列 [null, 'Log', 'Service'] の要素をスペースをデリミタとして使用して文字列に連結します。 null 要素を 'Alicloud' に置き換えます。
-
クエリ
* | SELECT array_join(array[null,'Log','Service'],' ','Alicloud') -
結果: _col0 列の値は
Alicloud Log Serviceです。
Array_max 関数
配列内の最大値を返します。
構文
array_max(x)
パラメーター
|
パラメーター |
説明 |
|
x |
入力は配列である必要があります。 重要
配列に null 要素が含まれている場合、関数は null を返します。 |
戻り値の型
返される値は、配列要素と同じデータの型です。
例
この例では、数値の配列から最大値を見つけます。
-
フィールド例
number:[49,50,45,47,50] -
クエリ文
*| SELECT array_max(try_cast(json_parse(number) as array(bigint))) AS max_number -
クエリ結果: max_number の値は 50 です。
Array_min 関数
配列内の最小値を返します。
構文
array_min(x)
パラメーター
|
パラメーター |
説明 |
|
x |
入力配列。 重要
配列に null 要素が含まれている場合、関数は null を返します。 |
戻り値の型
戻り値は、配列要素と同じデータの型です。
例
数値の配列から最小値を見つけます。
-
フィールド例
number:[49,50,45,47,50] -
クエリ文
*| SELECT array_min(try_cast(json_parse(number) as array(bigint))) AS min_number -
クエリは 45 を返します。
Array_position 関数
array_position 関数は、配列内の要素の1から始まるインデックスを返します。 要素が見つからない場合は 0 を返します。
構文
array_position(x, element)
パラメーター
|
パラメーター |
説明 |
|
x |
検索対象の配列。 |
|
element |
配列内で検索する要素。 説明
検索する要素が null の場合、関数は null を返します。 |
戻り値の型
bigint 値を返します。
例
配列 [49,45,47] 内の 45 のインデックスを検索します。
-
クエリと分析文
* | SELECT array_position(array[49,45,47],45) -
結果は
2で、要素45が配列のインデックス2にあることを示します。
array_remove 関数
array_remove 関数は、配列から指定された要素のすべての出現を削除します。
構文
array_remove(x, element)
パラメーター
|
パラメーター |
説明 |
|
x |
入力配列。 |
|
element |
配列から削除する要素。 説明
element が null の場合、関数は null を返します。 |
戻り値の型
配列を返します。
例
配列 [49,45,47] から 45 を削除します。
-
クエリと分析文
* | SELECT array_remove(array[49,45,47],45) -
結果は
[49,47]です。
array_sort 関数
array_sort 関数は、配列の要素を昇順にソートし、null 要素を末尾に配置します。
構文
array_sort(x)
パラメーター
|
パラメーター |
説明 |
|
x |
ソートする配列。 |
戻り値の型
配列を返します。
例
配列 ['b', 'd', null, 'c', 'a'] を昇順にソートします。
-
クエリ文
* | SELECT array_sort(array['b','d',null,'c','a']) -
結果は
["a","b","c","d",null]です。 要素はアルファベットの昇順にソートされ、null 値は末尾に配置されます。
array_transpose 関数
array_transpose 関数は、2次元配列 (マトリックス) を転置します。 内部配列間で同じインデックスを共有する要素をグループ化することにより、新しい2次元配列を作成します。
構文
array_transpose(x)
パラメーター
|
パラメーター |
説明 |
|
x |
入力は |
戻り値の型
array(double)
例
この関数は、各内部配列の同じインデックスにある要素をグループ化して、新しい内部配列を形成します。 たとえば、配列 [0,1,2,3]、[10,19,18,17]、および [9,8,7] から、関数は最初の要素 (0、10、および 9) を取得し、それらを新しい内部配列 [0.0,10.0,9.0] にグループ化します。
-
クエリと分析文
* | SELECT array_transpose(array[array[0,1,2,3],array[10,19,18,17],array[9,8,7]]) -
クエリと分析結果: _col0 列の値は
[[0.0,10.0,9.0],[1.0,19.0,8.0],[2.0,18.0,7.0],[3.0,17.0]]です。
array_union 関数
2つの配列の和集合の要素からなる配列を、重複なしで返します。
構文
array_union(x, y)
パラメーター
|
パラメーター |
説明 |
|
x |
配列である必要があります。 |
|
y |
配列である必要があります。 |
戻り値の型
array
例
この例では、配列 [1,2,3,4,5] と [1,3,5,7] の和集合を計算します。
-
クエリ文
* | SELECT array_union(array[1,2,3,4,5],array[1,3,5,7]) -
クエリは
[1,2,3,4,5,7]を返します。
Cardinality 関数
配列内の要素の数を返します。
構文
cardinality(x)
パラメーター
|
パラメーター |
説明 |
|
x |
入力配列。 |
戻り値の型
bigint 値を返します。
例
この例では、number フィールドの要素数をカウントします。
-
フィールド例
number:[49,50,45,47,50] -
クエリ文
*| SELECT cardinality(cast(json_parse(number) as array(bigint))) -
配列には 5 つの要素が含まれているため、クエリは
5を返します。
concat 関数
複数の配列を1つの配列に連結します。
構文
concat(x, y…)
パラメーター
|
パラメーター |
説明 |
|
x |
配列である必要があります。 |
|
y |
配列である必要があります。 |
戻り値の型
array
例
配列 ['red','blue'] と ['yellow','green'] を連結します。
-
クエリ文
* | SELECT concat(array['red','blue'],array['yellow','green']) -
クエリは
["red","blue","yellow","green"]を返します。
contains 関数
配列に指定された要素が含まれているかどうかを確認します。 見つかった場合は true を返します。
構文
contains(x, element)
パラメーター
|
パラメーター |
説明 |
|
x |
確認する配列。 |
|
element |
配列内で検索する要素。 |
戻り値の型
boolean
例
region フィールドに 'cn-beijing' が含まれているかどうかを確認します。
-
フィールド例
region:["cn-hangzhou","cn-shanghai","cn-beijing"] -
クエリ文
*| SELECT contains(cast(json_parse(region) as array(varchar)),'cn-beijing') -
クエリは
_col0という名前の列を返し、その値はtrueです。これは、region配列にcn-beijingが含まれていることを示します。
element_at 関数
配列のインデックス y にある要素を返します。
構文
element_at(x, y)
パラメーター
|
パラメーター |
説明 |
|
x |
要素を取得する配列。 |
|
y |
配列から取得する要素の1から始まる bigint インデックス。 |
戻り値の型
戻り値は、配列内の要素と同じデータの型です。
例
この例では、number フィールドに JSON 文字列として格納されている配列から2番目の要素を取得します。
-
フィールド例
number:[49,50,45,47,50] -
クエリと分析文
* | SELECT element_at(cast(json_parse(number) AS array(varchar)), 2) -
クエリは
_col0という名前の列を返し、その値は50です。
Filter 関数
filter 関数は、ラムダ式に基づいて配列をフィルター処理し、式が true と評価される要素のみを含む新しい配列を返します。
構文
filter(x, lambda_expression)
パラメーター
|
パラメーター |
説明 |
|
x |
入力配列。 |
|
lambda_expression |
ラムダ式。 詳細については、「ラムダ式」をご参照ください。 |
戻り値の型
配列を返します。
例
配列 [5,-6,null,7] から 0 より大きい要素を返します。 ラムダ式は x -> x > 0 です。
-
クエリ文
* | SELECT filter(array[5,-6,null,7],x -> x > 0) -
クエリは
[5,7]を返します。
Flatten 関数
2次元配列を1次元配列にフラット化します。
構文
flatten(x)
パラメーター
|
パラメーター |
説明 |
|
x |
フラット化する2次元配列。 値は配列である必要があります。 |
戻り値の型
1次元配列を返します。
例
この例では、2次元配列を1次元配列にフラット化します。
-
クエリ文
* | SELECT flatten(array[array[1,2,3,4],array[5,2,2,4]]) -
クエリと分析結果: _col0 列には
[1,2,3,4,5,2,2,4]が含まれます。
Reduce 関数
reduce 関数は、ラムダ式を配列に適用し、その要素を単一の値に集約します。
構文
reduce(array, initialState, inputFunction, outputFunction)
パラメーター
|
パラメーター |
説明 |
|
array |
bigint 要素の入力配列。 |
|
initialState, inputFunction, outputFunction |
リダクションロジックを定義します。これには、初期状態、各要素を処理する入力関数、および結果を最終処理する出力関数が含まれます。 詳細については、「ラムダ式」をご参照ください。 |
戻り値の型
bigint
例
配列 [5, 20, 50] の要素の合計を計算します。
-
クエリ文
* | SELECT reduce(array[5, 20, 50], 0, (s, x) -> s + x, s -> s) -
クエリ結果:
75
Reverse 関数
配列内の要素の順序を逆にします。
構文
reverse(x)
パラメーター
|
パラメーター |
説明 |
|
x |
逆にする配列。 |
戻り値の型
要素が逆の順序になった配列。
例
配列 [1,2,3,4,5] の要素を逆にします。
-
クエリ文
* | SELECT reverse(array[1,2,3,4,5]) -
クエリ結果:
[5,4,3,2,1]。
Sequence 関数
sequence 関数は、指定された範囲内で連続的に増加する値の配列を返します。
構文
-
デフォルトのステップ 1 を使用します。
sequence(x, y) -
カスタムステップを使用します。
sequence(x, y, step)
パラメーター
|
パラメーター |
説明 |
|
x |
シーケンスの開始値。 サポートされているデータの型は bigint と timestamp です。 timestamp 型の場合、UNIX タイムスタンプまたは日時式を使用できます。 |
|
y |
シーケンスの終了値。 サポートされているデータの型は bigint と timestamp です。 timestamp 型の場合、UNIX タイムスタンプまたは日時式を使用できます。 |
|
step |
ステップ値。 x と y が日時式の場合、step パラメーターは次のいずれかのフォーマットである必要があります:
|
戻り値の型
array
例
-
0 から 10 までの偶数を返します。
-
クエリ文
* | SELECT sequence(0,10,2) -
クエリは
[0,2,4,6,8,10]を返します。
-
-
2017年10月23日から2021年8月12日までの日付を1年間隔で返します。
-
クエリ文
ww* | SELECT sequence(from_unixtime(1508737026),from_unixtime(1628734085),interval '1' year to month ) -
クエリ結果
["2017-10-23 13:37:06.000","2018-10-23 13:37:06.000","2019-10-23 13:37:06.000","2020-10-23 13:37:06.000"]
-
-
1628733298 から 1628734085 までの UNIX タイムスタンプを 60 秒間隔で返します。
-
クエリ文
* | SELECT sequence(1628733298,1628734085,60) -
結果では、
_col0フィールドにタイムスタンプ配列[1628733298,1628733358,1628733418,1628733478,1628733538,1628733598,1628733658,1628733718,1628733778,1628733838,1628733898,1628733958,1628734018,1628734078]が含まれます。
-
Shuffle 関数
配列の要素をランダムにシャッフルします。
構文
shuffle(x)
パラメーター
|
パラメーター |
説明 |
|
x |
配列である必要があります。 |
戻り値の型
配列を返します。
例
この例では、配列 [1,2,3,4,5] のランダムな順列を返します。
-
クエリと分析文
*| SELECT shuffle(array[1,2,3,4,5]) -
クエリと分析結果: クエリは、ランダムに並べ替えられた配列を含む単一の列
_col0を返します。 値の例には、[3,1,2,4,5]、[5,1,2,4,3]、[2,5,3,1,4]などがあります。
slice 関数
配列のサブセットを返します。
構文
slice(x, start, length)
パラメーター
|
パラメーター |
説明 |
|
x |
入力配列。 |
|
start |
スライスの1から始まる開始インデックス。
|
|
length |
サブセットに含める要素の数。 |
戻り値の型
array
例
この例では、配列 [1,2,4,5,6,7,7] の3番目の要素から始まる2つの要素のサブセットを返します。
-
クエリと分析文
* | SELECT slice(array[1,2,4,5,6,7,7],3,2) -
クエリと分析結果: _col0 列には
[4,5]が含まれます。
Transform 関数
transform 関数は、ラムダ式を配列の各要素に適用します。
構文
transform(x, lambda_expression)
パラメーター
|
パラメーター |
説明 |
|
x |
配列である必要があります。 |
|
lambda_expression |
適用するラムダ式。 詳細については、「ラムダ式」をご参照ください。 |
戻り値の型
配列。
例
この例では、配列 [5,6] の各要素に 1 を加算します。
-
クエリと分析文
* | SELECT transform(array[5,6],x -> x + 1) -
クエリは
[6,7]を返します。
zip 関数
zip 関数は、複数の配列を2次元配列にマージします。 入力配列から同じインデックスを持つ要素をグループ化して、ネストされた配列を形成します。
構文
zip(x, y...)
パラメーター
|
パラメーター |
説明 |
|
x |
配列である必要があります。 |
|
y |
配列である必要があります。 |
戻り値の型
2次元配列を返します。
例
この例では、配列 [1,2,3]、['1b',null,'3b']、および [1,2,3] を2次元配列にマージします。
-
クエリと分析文
* | SELECT zip(array[1,2,3], array['1b',null,'3b'],array[1,2,3]) -
クエリと分析結果の _col0 列は
[[1,"1b",1],[2,null,2],[3,"3b",3]]を返します。 この関数は、共有インデックスによって入力配列の要素をグループ化します。
zip_with 関数
zip_with 関数は、ラムダ式を対応する要素に適用することで、2つの配列をマージします。
構文
zip_with(x, y, lambda_expression)
パラメーター
|
パラメーター |
説明 |
|
x |
最初の入力配列。 |
|
y |
2番目の入力配列。 |
|
lambda_expression |
要素を結合する方法を指定するラムダ式。 詳細については、「ラムダ式」をご参照ください。 |
戻り値の型
array
例
この例では、ラムダ式 (x, y) -> x + y を使用して、配列 [1,2] と [3,4] の対応する要素を加算します。 この関数は、結果を新しい配列で返します。
-
クエリと分析文
SELECT zip_with(array[1,2], array[3,4],(x,y) -> x + y) -
クエリと分析結果:
_col0列の値は[4,6]です。