本文介紹數組函數和運算符的基礎語法及示例。
日志服務支持如下數組函數和運算符。
函數名稱 | 語法 | 說明 | 支持SQL | 支持SPL |
[x] | 返回數組中的第x個元素。等同于element_at函數。 | √ | × | |
array_agg(x) | 以數組形式返回x中的所有值。 | √ | × | |
array_distinct(x) | 刪除數組中重復的元素。 | √ | √ | |
array_except(x, y) | 計算兩個數組的差集。 | √ | √ | |
array_intersect(x, y) | 計算兩個數組的交集。 | √ | √ | |
array_join(x, delimiter) | 使用指定的連接符將數組中的元素拼接為一個字符串。如果數組中包含null元素,則null元素將被忽略。 重要 使用array_join函數時,返回結果大小最大為1 KB,超出1 KB的數據會被截斷。 | √ | √ | |
array_join(x, delimiter, null_replacement) | 使用指定的連接符將數組中的元素拼接為一個字符串。如果數組中包含null元素,則null元素將被替換為null_replacement。 重要 使用array_join函數時,返回結果大小最大為1 KB,超出1 KB的數據會被截斷。 | √ | √ | |
array_max(x) | 獲取數組中的最大值。 | √ | √ | |
array_min(x) | 獲取數組中的最小值。 | √ | √ | |
array_position(x, element) | 獲取指定元素的下標,下標從1開始。如果指定元素不存在,則返回0。 | √ | √ | |
array_remove(x, element) | 刪除數組中指定的元素。 | √ | √ | |
array_sort(x) | 對數組元素進行升序排序。如果有null元素,則null元素排在最后。 | √ | √ | |
array_transpose(x) | 對矩陣進行轉置,即提取二維數組中索引相同的元素組成一個新的二維數組。 | √ | × | |
array_union(x, y) | 計算兩個數組的并集。 | √ | × | |
cardinality(x) | 計算數組中元素的個數。 | √ | √ | |
concat(x, y…) | 將多個數組拼接為一個數組。 | √ | × | |
contains(x, element) | 判斷數組中是否包含指定元素。如果包含,則返回true。 | √ | × | |
element_at(x, y) | 返回數組中的第y個元素。 | √ | × | |
filter(x, lambda_expression) | 結合Lambda表達式,用于過濾數組中的元素。只返回滿足Lambda表達式的元素。 | √ | √ | |
flatten(x) | 將二維數組轉換為一維數組。 | √ | × | |
reduce(x, lambda_expression) | 根據Lambda表達式中的定義,對數組中的各個元素進行相加計算,然后返回計算結果。 | √ | √ | |
reverse(x) | 對數組中的元素進行反向排列。 | √ | √ | |
sequence(x, y) | 通過指定的起始值返回一個數組,其元素為起始值范圍內一組連續且遞增的值。遞增間隔為默認值1。 | √ | √ | |
sequence(x, y, step) | 通過指定的起始值返回一個數組,其元素為起始值范圍內一組連續且遞增的值,并自定義遞增間隔。 | √ | √ | |
shuffle(x) | 對數組元素進行隨機排列。 | √ | √ | |
slice(x, start, length) | 獲取數組的子集。 | √ | √ | |
transform(x, lambda_expression) | 將Lambda表達式應用到數組的每個元素中。 | √ | √ | |
zip(x, y...) | 將多個數組合并為一個二維數組,且各個數組中下標相同的元素組成一個新的數組。 | √ | √ | |
zip_with(x, y, lambda_expression) | 根據Lambda表達式中的定義將兩個數組合并為一個數組。 | √ | × |
下標運算符
下標運算符用于返回數組中的第x個元素。等同于element_at函數。
語法
[x]
參數說明
參數 | 說明 |
x | 數組下標,從1開始。參數值為bigint類型。 |
返回值類型
返回指定元素的數據類型。
示例
返回number字段值中的第1個元素。
字段樣例
number:[49,50,45,47,50]
查詢和分析語句
* | SELECT cast(json_parse(number) as array(bigint)) [1]
查詢和分析結果
array_agg函數
array_agg函數會以數組形式返回x中的所有值。
語法
array_agg (x)
參數說明
參數 | 說明 |
x | 參數值為任意數據類型。 |
返回值類型
array類型。
示例
以數組形式返回status字段的值。
查詢和分析語句
* | SELECT array_agg(status) AS array
查詢和分析結果
array_distinct函數
array_distinct函數用于刪除數組中重復的元素。
語法
array_distinct(x)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
返回值類型
array類型。
示例
刪除number字段值中重復的元素。
字段樣例
number:[49,50,45,47,50]
查詢和分析語句
*| SELECT array_distinct(cast(json_parse(number) as array(bigint)))
查詢和分析結果
array_except函數
array_except函數用于計算兩個數組的差集。
語法
array_except(x, y)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
y | 參數值為array類型。 |
返回值類型
array類型。
示例
計算數組[1,2,3,4,5]和[1,3,5,7]的差集。
查詢和分析語句
* | SELECT array_except(array[1,2,3,4,5],array[1,3,5,7])
查詢和分析結果
array_intersect函數
array_intersect函數用于計算兩個數組的交集。
語法
array_intersect(x, y)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
y | 參數值為array類型。 |
返回值類型
array類型。
示例
計算數組[1,2,3,4,5]和[1,3,5,7]的交集。
查詢和分析語句
* | SELECT array_intersect(array[1,2,3,4,5],array[1,3,5,7])
查詢和分析結果
array_join函數
array_join函數使用指定的連接符將數組中的元素拼接為一個字符串。
語法
使用指定的連接符將數組中的元素拼接為一個字符串。如果數組中包含null元素,則null元素將被忽略。
array_join(x, delimiter)
使用指定的連接符將數組中的元素拼接為一個字符串。如果數組中包含null元素,則null元素將被替換為null_replacement。
array_join(x, delimiter,null_replacement)
參數說明
參數 | 說明 |
x | 參數值為任意array類型。 |
delimiter | 連接符,可以為字符串。 |
null_replacement | 用于替換null元素的字符串。 |
返回值類型
varchar類型。
示例
使用空格將數組[null, 'Log','Service']中的元素拼接為一個字符串,其中null元素替換為Alicloud。
查詢和分析語句
* | SELECT array_join(array[null,'Log','Service'],' ','Alicloud')
查詢和分析結果
array_max函數
array_max函數用于獲取數組中的最大值。
語法
array_max(x)
參數說明
參數 | 說明 |
x | 參數值為array類型。 重要 如果數組中包含null,則返回結果為null。 |
返回值類型
與參數值中元素的數據類型一致。
示例
獲取數組中的最大值。
字段樣例
number:[49,50,45,47,50]
查詢和分析語句
*| SELECT array_max(try_cast(json_parse(number) as array(bigint))) AS max_number
查詢和分析結果
array_min函數
array_min函數用于獲取數組中的最小值。
語法
array_min(x)
參數說明
參數 | 說明 |
x | 參數值為array類型。 重要 如果數組中包含null,則返回結果為null。 |
返回值類型
與參數值中元素的數據類型一致。
示例
獲取數組中的最小值。
字段樣例
number:[49,50,45,47,50]
查詢和分析語句
*| SELECT array_min(try_cast(json_parse(number) as array(bigint))) AS min_number
查詢和分析結果
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)
查詢和分析結果
array_remove函數
array_remove函數用于刪除數組中指定的元素。
語法
array_remove(x, element)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
element | 數組中的一個元素。 說明 如果待刪除的元素為null ,則返回結果也為null。 |
返回值類型
array類型。
示例
刪除數組[49,45,47]中45。
查詢和分析語句
* | SELECT array_remove(array[49,45,47],45)
查詢和分析結果
array_sort函數
array_sort函數用于對數組元素進行升序排序。如果有null元素,則null元素排在最后。
語法
array_sort(x)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
返回值類型
array類型。
示例
對數組['b', 'd', null, 'c', 'a']進行升序排序。
查詢和分析語句
* | SELECT array_sort(array['b','d',null,'c','a'])
查詢和分析結果
array_transpose函數
array_transpose函數用于對矩陣進行轉置,即提取二維數組中索引相同的元素組成一個新的二維數組。
語法
array_transpose(x)
參數說明
參數 | 說明 |
x | 參數值為array(double)類型。 |
返回值類型
array(double)類型。
示例
提取二維數組中索引相同的元素組成一個新的二維數組,例如數組[0,1,2,3]、[10,19,18,17]、[9,8,7]中的0、10、9的索引都為1,則組成數組[0.0,10.0,9.0]。
查詢和分析語句
* | SELECT array_transpose(array[array[0,1,2,3],array[10,19,18,17],array[9,8,7]])
查詢和分析結果
array_union函數
array_union函數用于計算兩個數組的并集。
語法
array_union(x, y)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
y | 參數值為array類型。 |
返回值類型
array類型。
示例
計算數組[1,2,3,4,5]和[1,3,5,7]的并集。
查詢和分析語句
* | SELECT array_union(array[1,2,3,4,5],array[1,3,5,7])
查詢和分析結果
cardinality函數
cardinality函數用于計算數組中元素的個數。
語法
cardinality(x)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
返回值類型
bigint類型。
示例
計算number字段值中元素的個數。
字段樣例
number:[49,50,45,47,50]
查詢和分析語句
*| SELECT cardinality(cast(json_parse(number) as array(bigint)))
查詢和分析結果
concat函數
concat函數用于將多個數組拼接為一個數組。
語法
concat(x, y…)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
y | 參數值為array類型。 |
返回值類型
array類型。
示例
將數組['red','blue']和['yellow','green']拼接為一個數組。
查詢和分析語句
* | SELECT concat(array['red','blue'],array['yellow','green'])
查詢和分析結果
contains函數
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')
查詢和分析結果
element_at函數
element_at函數用于返回數組中的第y個元素。
語法
element_at(x, y)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
y | 數組下標,從1開始。參數值為bigint類型。 |
返回值類型
任意數據類型。
示例
返回number字段值中的第2個元素。
字段樣例
number:[49,50,45,47,50]
查詢和分析語句
* | SELECT element_at(cast(json_parse(number) AS array(varchar)), 2)
查詢和分析結果
filter函數
filter函數和Lambda表達式結合,用于過濾數組中的元素。只返回滿足Lambda表達式的元素。
語法
filter(x, lambda_expression)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
lambda_expression | Lambda表達式。更多信息,請參見Lambda表達式。 |
返回值類型
array類型。
示例
返回數組[5,-6,null,7]中大于0的元素,其中x -> x > 0
為Lambda表達式。
查詢和分析語句
* | SELECT filter(array[5,-6,null,7],x -> x > 0)
查詢和分析結果
flatten函數
flatten函數用于將二維數組轉換為一維數組。
語法
flatten(x)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
返回值類型
array類型。
示例
將數組array[1,2,3,4]和array[5,2,2,4]轉換為一維數組。
查詢和分析語句
* | SELECT flatten(array[array[1,2,3,4],array[5,2,2,4]])
查詢和分析結果
reduce函數
reduce函數將根據Lambda表達式中的定義,對數組中的各個元素進行相加計算,然后返回計算結果。
語法
reduce(x, lambda_expression)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
lambda_expression | 第一個參數是初始值,第二個參數是Lambda表達式,第三個參數是對Lambda表達式計算結果的處理。 |
返回值類型
bigint類型。
示例
返回數組[5, 20, 50]中各個元素相加的結果。
查詢和分析語句
* | SELECT reduce(array[5,20,50],0,(s, x) -> s + x, s -> s)
查詢和分析結果
reverse函數
reverse函數用于對數組中的元素進行反向排列。
語法
reverse(x)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
返回值類型
array類型。
示例
將數組[1,2,3,4,5]中的元素反向排序。
查詢和分析語句
* | SELECT reverse(array[1,2,3,4,5])
查詢和分析結果
sequence函數
sequence函數通過指定的起始值返回一個數組,其元素為起始值范圍內一組連續且遞增的值。
語法
遞增間隔為默認值1。
sequence(x, y)
自定義遞增間隔。
sequence(x, y, step)
參數說明
參數 | 說明 |
x | 參數值為bigint類型、timestamp類型(Unix時間戳、日期和時間表達式)。 |
y | 參數值為bigint類型、timestamp類型(Unix時間戳、日期和時間表達式)。 |
step | 數值間隔。 當參數值為日期和時間表達式時,step格式如下:
|
返回值類型
array類型。
示例
示例1:返回0~10之間的偶數。
查詢和分析語句
* | SELECT sequence(0,10,2)
查詢和分析結果
示例2:返回2017-10-23到2021-08-12之間的日期,間隔為1年。
查詢和分析語句
ww* | SELECT sequence(from_unixtime(1508737026),from_unixtime(1628734085),interval '1' year to month )
查詢和分析結果
示例3:返回1628733298,1628734085之間的Unix時間戳,間隔為60秒。
查詢和分析語句
* | SELECT sequence(1628733298,1628734085,60)
查詢和分析結果
shuffle函數
shuffle函數用于對數組元素進行隨機排列。
語法
shuffle(x)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
返回值類型
array類型。
示例
對數組[1,2,3,4,5]中的元素進行隨機排序。
查詢和分析語句
*| SELECT shuffle(array[1,2,3,4,5])
查詢和分析結果
slice函數
slice函數用于返回數組的子集。
語法
slice(x, start, length)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
start | 指定索引開始的位置。
|
length | 指定子集中元素的個數。 |
返回值類型
array類型。
示例
返回數組[1,2,4,5,6,7,7]的子集,從第三個元素開始返回,子集元素個數為2。
查詢和分析語句
* | SELECT slice(array[1,2,4,5,6,7,7],3,2)
查詢和分析結果
transform函數
transform函數用于將Lambda表達式應用到數組的每個元素中。
語法
transform(x, lambda_expression)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
lambda_expression | Lambda表達式。更多信息,請參見Lambda表達式。 |
返回值類型
array類型。
示例
將數組[5,6]中的各個元素加1,然后返回。
查詢和分析語句
* | SELECT transform(array[5,6],x -> x + 1)
查詢和分析結果
zip函數
zip函數用于將多個數組合并為一個二維數組,且各個數組中下標相同的元素組成一個新的數組。
語法
zip(x, y...)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
y | 參數值為array類型。 |
返回值類型
array類型。
示例
將數組[1,2,3]、['1b',null,'3b']和[1,2,3]合并為一個二維數組。
查詢和分析語句
* | SELECT zip(array[1,2,3], array['1b',null,'3b'],array[1,2,3])
查詢和分析結果
zip_with函數
zip_with函數將根據Lambda表達式中的定義將兩個數組合并為一個數組。
語法
zip_with(x, y, lambda_expression)
參數說明
參數 | 說明 |
x | 參數值為array類型。 |
y | 參數值為array類型。 |
lambda_expression | Lambda表達式。更多信息,請參見Lambda表達式。 |
返回值類型
array類型。
示例
使用Lambda表達式(x, y) -> x + y
使數組[1,2]和[3,4]中的元素分別相加后,以數組類型返回相加的結果。
查詢和分析語句
SELECT zip_with(array[1,2], array[3,4],(x,y) -> x + y)
查詢和分析結果