本文介绍日志服务支持的数组函数语法及常见场景的使用示例。
说明
在日志服务分析语句(SQL 语句)中,需要使用单引号('')包裹代表字符串的字符,无符号包裹或被双引号("")包裹的字符为字段名或列名。例如'time' 代表字符串,time 或 "time" 代表字段名或列名。
下标运算符用于返回数组中第 x 个元素。等同于 ELEMENT_AT 函数。
- 返回数组 [5.0,20.0,39.0, 1, 7] 中的第 1 个元素。
* | SELECT array[5.0,20.0,39.0,1,7][1]
-
ARRAY_AGG 函数用于聚合一组值,并以数组形式返回。
- 聚合 test_double 字段的值,并以数组形式返回。
-
* | SELECT ARRAY_AGG(test_double) AS array
-
ARRAY_DISTINCT 函数用于删除重复的数组元素。
-
*| SELECT ARRAY_DISTINCT(cast(JSON_PARSE(test_text) as array(bigint)))
-
ARRAY_EXCEPT 函数用于删除两个数组中的重复元素,并返回被删除重复元素后的第一个数组。
ARRAY_EXCEPT(KEY1, KEY2)
- 删除数组[10,2,30,14,5]和[4,2,5,7]中的重复元素2、5,然后返回第一个数组[10,30,14]。
* | SELECT ARRAY_EXCEPT(array[10,2,30,14,5],array[4,2,5,7])
-
ARRAY_INTERSECT 函数用于返回两个数组的交集。
ARRAY_INTERSECT(KEY1, KEY2)
- 计算数组[10,2,30,14,5]和[4,2,5,7]的交集。
* | SELECT ARRAY_INTERSECT(array[10,2,30,14,5],array[4,2,5,7])
-
ARRAY_JOIN 函数用于将数组元素拼接为一个字符串。
- 使用指定的连接符将数组元素拼接为一个字符串。如果数组中包含 NULL 元素,则忽略 NULL 元素。
ARRAY_JOIN(KEY, delimiter)
- 使用指定的连接符将数组元素拼接为一个字符串。如果数组中包含 null 元素,则指定其他字符串代替 null 元素。
ARRAY_JOIN(KEY, delimiter,null_replacement)
- 使用空格将数组 [null, 'Hello','World'] 中的元素拼接为一个字符串,并使用Replace替换 null 元素。
* | SELECT ARRAY_JOIN(array[null,'Hello','World'],' ','Replace')
-
ARRAY_MAX 函数用于提取数组元素中的最大值。
- 返回值与数组元素的数据类型一致。如果数组中包含 NULL,则返回结果为 NULL。
-
*| SELECT ARRAY_MAX(TRY_CAST(JSON_PARSE(test_text) as ARRAY(bigint))) AS max_number
-
ARRAY_MIN 函数用于提取数组元素中的最小值。
- 返回值与数组元素的数据类型一致。如果数组中包含 NULL,则返回结果为 NULL。
-
*| SELECT ARRAY_MIN(try_cast(JSON_PARSE(test_text) as array(bigint))) AS min_number
-
ARRAY_POSITION 函数用于查找指定元素的位置,元素索引从 1 开始。
ARRAY_POSITION(KEY, element)
- 返回值为 Bigint 类型。如果元素为 null ,则返回结果也为 null ;如果元素不存在,则返回 0。
- 查找数组 [23,94,18,66] 中元素 18 的位置。
* | SELECT ARRAY_POSITION(array[23,94,18,66],18)
-
ARRAY_REMOVE 函数用于删除指定的数组元素。
ARRAY_REMOVE(KEY, element)
- 返回值为 Array 类型。如果待删除的元素为 null ,则返回结果也为 null。
* | SELECT ARRAY_REMOVE(array[49,45,47],45)
-
ARRAY_SORT 函数按照升序对数组元素进行排列。如果存在 NULL 元素,则将 NULL 元素排在最后。
- 对数组['e', 'k', null, 'v', 'y']进行升序排序。
* | SELECT ARRAY_SORT(ARRAY['e', 'k', null, 'v', 'y'])
-
ARRAY_TRANSPOSE 函数用于对数组进行转置操作, 提取二维数组中索引相同的元素组成一个新的二维数组。
- 提取数组 [5,3,7,1]、[20,39,189,117]、[39,85,27] 中索引都为 1 的元素 5、20、39 ,组成数组 [5.0,20.0,39.0];提取数组 [5,3,7,1]、[20,39,189,117]、[39,85,27] 中索引都为 2 的元素 3、39、85,组成数组 [3.0,39.0,85.0];以此类推,组成一个新的二维数组。
* | SELECT ARRAY_TRANSPOSE(array[array[5,3,7,1],array[20,39,189,117],array[39,85,27]])
-
ARRAY_UNION 函数用于计算两个数组的并集。
- 计算数组[10,2,30,14,5]和[4,2,5,7]的并集。
* | SELECT ARRAY_UNION(ARRAY[10,2,30,14,5],ARRAY[4,2,5,7])
-
CARDINALITY 函数用于统计数组元素的个数。
-
*| SELECT CARDINALITY(CAST(JSON_PARSE(test_text) as ARRAY(bigint)))
-
CONCAT 函数用于拼接多个数组为一个数组。
- 将数组 [10,2,30,14,5] 和 [4,2,5,7] 拼接为一个数组。
* | SELECT CONCAT(ARRAY[10,2,30,14,5],ARRAY[4,2,5,7])
-
CONTAINS 函数用于判断数组是否包含某个元素。
- 返回值为 Boolean 类型。如果数组中包含某个元素,则返回 true,否则反正 false。
- 计算 test_text 字段值中是否包含 50。
-
*| SELECT CONTAINS(cast(JSON_PARSE(test_text) as array(bigint)), 50)
-
ELEMENT_AT 函数用于获取数组中指定位置的元素。
- 返回数组 [5.0,20.0,39.0, 1, 7] 中的第 3 个元素。
* | SELECT ELEMENT_AT(array[5.0,20.0,39.0, 1, 7], 3)
-
结合 FILTER 函数和 Lambda 表达式,过滤数组中的元素。
FILTER(KEY, lambda_expression)
- 返回值为 Array 类型。返回的数组中只包含满足 Lambda 表达式的元素。
- 结合 Lambda 表达式 x -> x > 0,返回数组 [10,-1,null,9,-7] 中大于 0 的元素。
* | SELECT FILTER(array[10,-1,null,9,-7],x -> x > 0)
-
FLATTEN 函数用于将二维数组转换为一维数组。
- 将二维数组 array[array[3,9,4,8,0],array[9,9,7,4,1]] 转换为一维数组。
* | SELECT FLATTEN(array[array[3,9,4,8,0],array[9,9,7,4,1]])
-
REDUCE 函数将根据 Lambda 表达式中的定义,对数组中的各个元素进行累积计算,然后返回计算结果。
REDUCE(KEY, lambda_expression)
- 返回数组 ['hello', 'world', '!'] 中各个元素连接后的结果。
* | SELECT REDUCE(array['hello', 'world', '!'],'',(s, x) -> s || ' ' || x, s -> s)
-
REVERSE 函数用于反向排列数组元素。
- 将数组[100,500,300,400,200]中的元素反向排序。
* | SELECT REVERSE(array[100,500,300,400,200])
-
SEQUENCE 函数用于生成指定范围内的数组,其元素为指定范围内一组连续且递增的值。
* | SELECT SEQUENCE(1,9,2)
-
- 场景2:生成 2024-08-01 到 2024-08-25 之间的日期序列,间隔为 3 天。
* | SELECT SEQUENCE (FROM_UNIXTIME(1722441600),FROM_UNIXTIME(1724515200),interval '3' day )
-
- 场景3:返回 1722441600 到 1724515200 之间的 Unix 时间戳,间隔为 3 天。
* | SELECT sequence(1722441600,1724515200,3 * 24 * 60 * 60)
-
SHUFFLE 函数用于对数组元素进行随机重新排列。
- 对数组 [99,87,16,43,25] 中的元素进行随机重新排序。
*| SELECT SHUFFLE(array[99,87,16,43,25])
-
SLICE 函数用于获取数组的子集。
SLICE(KEY, start, length)
- 返回数组 [99,87,16,43,25] 的子集,从第 2 个元素开始返回,子集元素个数为 3。
* | SELECT SLICE(array[99,87,16,43,25],2,3)
-
TRANSFORM 函数用于将 Lambda 表达式应用到数组的每个元素中。
TRANSFORM(KEY, lambda_expression)
- 将数组 [99,87,16,43,25] 中的各个元素乘以 2,然后返回计算结果。
* | SELECT TRANSFORM(array[99,87,16,43,25],x -> x * 2)
-
ZIP 函数用于将多个数组按照对应位置组合为一个二维数组,各个数组中索引相同的元素组成一个新的数组。
- 将数组 [7,1,9]、['hello','world','!'] 和 [99,87,16] 合并为一个二维数组。
* | SELECT ZIP(array[7,1,9], array['hello','world','!'],array[99,87,16])
-