3.1.1及以后版本的ADB集群支持Array、Map数据类型。本文介绍了Array数据类型的定义、注意事项及使用示例。

Array类型定义

Array类型,存储数组,可重复,含义类似java中list。Array中数据为相同类型。例如,列A定义array<int>, 那么A中子元素均为int类型。支持嵌套,例如array<array<string>>。

注意事项

Array/Map列不支持构建索引,因此,在SQL查询语句中不建议直接过滤,需配合其他检索条件过滤。尽量减少scan数据量。

使用示例

创建表
Create Table `array_test` (
 `a` int,
 `b` array<int>,
 `c` array<array<string>>,
 primary key (`a`)
) DISTRIBUTE BY HASH(`a`)
写入数据
比如插入一行数据,其中b=[1,2,3], c=[["a"],["b","c"]]
insert into array_test values (1, '[1,2,3]', '[["a"],["b","c"]]');
查询数据
mysql> select * from array_test;
+------+---------+-------------------+
| a    | b       | c                 |
+------+---------+-------------------+
|    1 | [1,2,3] | [["a"],["b","c"]] |
+------+---------+-------------------+
1 row in set (0.08 sec)
注意
  • Array类型下标是从1开始,而不是0。
  • Array的取址操作:b[1]等价于函数element_at(b, 1)
mysql> select a,b[1],element_at(b,1),c[2],element_at(c,2) from array_test;
+------+------+-----------------+-----------+-----------------+
| a    | b[1] | element_at(b,1) | c[2]      | element_at(c,2) |
+------+------+-----------------+-----------+-----------------+
|    1 |    1 |               1 | ["b","c"] | ["b","c"]       |
+------+------+-----------------+-----------+-----------------+
1 row in set (0.11 sec)

查询结果返回类型为Array/Map的列,以json format字符串输出。比如c[2]对应的是嵌套子列,类型为array<string>,那么以json format返回。

支持的函数

函数 描述 返回类型
element_at 取值,下标从1开始element_at(array[1,2], 1) ==> 1 T
size 元素个数 int
contains 是否包含子元素contains(array[1,2], 2) ==> 1 bool类型
array_max 取子元素最大值 T
array_min 取子元素最小值 T
array_position 取第一次出现的index array_position(array['a','b','b'],'b') ==>2 int
array_remove 移除子元素array_remove(array['a','b','b'],'b')==>['a'] array<T>
array_sort 排序array_sort(array[3,2,1]) ==> [1,2,3] array<T>
reverse 将数组中的子元素反转(array[5,9,3]) ==>[3,9,5] array<T>
shuffle 把数组中的元素按随机顺序重新排列。shuffle(array[1,5,8])==> [5,1,8] array<T>
slice 截取子元素array slice(array[1,2,3,4,5], 3,2) ==> [3,4] array<T>
concat 子元素合并,包含重复concat(array[1], array[1,2]) ==>[1,1,2] array<T>
array_distinct 子元素去重array_distinct(array[1,1,2]) ==>[1,2] array<T>
array_union 子元素合并,且去重array_union(array[1], array[1,2])==>[1,2] array<T>
array_intersect 求交集array_intersect(array[1], array[1,2]) ==>[1] array<T>
array_join 类似Joiner拼接array元素array_join(array[1,2,3,4],'a') ==>1a2a3a4 string
flatten 降维,比如flatten(array[array[1,2],array[3]])==>[1,2,3] array<X>