최종 수정: 에
ARRAY 문서
타입 설명
ARRAY<T> 타입은 각 요소의 데이터 타입이 동일한 순서 있는 컬렉션을 나타내는 데 사용됩니다. 예를 들어 정수 배열은 [1, 2, 3]으로, 문자열 배열은 ["a", "b", "c"]로 표현할 수 있습니다.
ARRAY<T>는 T 타입의 요소로 구성된 배열을 나타내며, T는 NULL을 허용합니다. T로 지원되는 타입은 다음과 같습니다:BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, DATE, DATETIME, TIMESTAMPTZ, CHAR, VARCHAR, STRING, IPV4, IPV6, STRUCT, MAP, VARIANT, JSONB, ARRAY<T>.- 참고: 위의 T 타입 중
JSONB와VARIANT는 Doris의 연산 계층에서만 지원되며, Doris에서 테이블을 생성할 때ARRAY<JSONB>와ARRAY<VARIANT>를 사용하는 것은 지원되지 않습니다.
- 참고: 위의 T 타입 중
타입 제약 사항
ARRAY<T>타입이 지원하는 최대 중첩 깊이는 9입니다.ARRAY<T>타입 간 변환은 T의 변환 가능 여부에 따라 결정됩니다.Array<T>타입은 다른 타입으로 변환할 수 없습니다.- 예:
ARRAY<INT>는ARRAY<BIGINT>로 변환할 수 있습니다.INT와BIGINT간에 변환이 가능하기 때문입니다. Variant타입은Array<T>타입으로 변환할 수 있습니다.- 문자열 타입은
ARRAY<T>타입으로 변환할 수 있습니다(파싱을 통해 변환하며, 파싱에 실패하면 NULL을 반환합니다).
- 예:
AGGREGATE테이블 모델에서ARRAY<T>타입은REPLACE와REPLACE_IF_NOT_NULL만 지원합니다. 어떤 테이블 모델에서도 KEY 컬럼이나 파티션 컬럼, 버킷 컬럼으로 사용할 수 없습니다.ARRAY<T>타입의 컬럼은ORDER BY와GROUP BY연산을 지원합니다.ORDER BY와GROUP BY를 지원하는 T 타입은 다음과 같습니다:BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL, DATE, DATETIME, TIMESTAMPTZ, CHAR, VARCHAR, STRING, IPV4, IPV6.
ARRAY<T>타입의 컬럼은IN또는NOT IN연산을 지원하지 않습니다.ARRAY<T>타입의 컬럼은JOIN KEY로 사용할 수 없으며DELETE문에서도 사용할 수 없습니다.
상수 생성
-
ARRAY()함수를 사용하여ARRAY<T>타입의 값을 생성합니다. T는 매개변수들의 공통 타입입니다.-- [1, 2, 3] T is INT
SELECT ARRAY(1, 2, 3);
-- ["1", "2", "abc"] , T is STRING
SELECT ARRAY(1, 2, 'abc'); -
[]를 사용하여ARRAY<T>타입의 값을 생성합니다. T는 매개변수들의 공통 타입입니다.-- ["abc", "def", "efg"] T is STRING
SELECT ["abc", "def", "efg"];
-- ["1", "2", "abc"] , T is STRING
SELECT [1, 2, 'abc'];
타입 변경
-
ARRAY내부의 요소 타입이VARCHAR인 경우에만 변경할 수 있습니다.VARCHAR의 매개변수 값은 작은 값에서 큰 값으로만 변경할 수 있으며, 그 반대로는 변경할 수 없습니다.
CREATE TABLE `array_table` (
`k` INT NOT NULL,
`array_column` ARRAY<VARCHAR(10)>
) ENGINE=OLAP
DUPLICATE KEY(`k`)
DISTRIBUTED BY HASH(`k`) BUCKETS 1
PROPERTIES (
"replication_num" = "1"
);
ALTER TABLE array_table MODIFY COLUMN array_column ARRAY<VARCHAR(20)>; -
ARRAY<T>타입 컬럼의 기본값은 NULL로만 지정할 수 있으며, 한 번 지정하면 변경할 수 없습니다.
요소 접근
-
[k]를 사용하여ARRAY<T>의 k번째 요소에 접근합니다. k는 1부터 시작하며, 범위를 벗어나면 NULL을 반환합니다.SELECT [1, 2, 3][1];
+--------------+
| [1, 2, 3][1] |
+--------------+
| 1 |
+--------------+
SELECT ARRAY(1, 2, 3)[2];
+-------------------+
| ARRAY(1, 2, 3)[2] |
+-------------------+
| 2 |
+-------------------+
SELECT [[1,2,3],[2,3,4]][1][3];
+-------------------------+
| [[1,2,3],[2,3,4]][1][3] |
+-------------------------+
| 3 |
+-------------------------+ -
ELEMENT_AT(ARRAY, k)를 사용하여ARRAY<T>의 k번째 요소에 접근합니다. k는 1부터 시작하며, 범위를 벗어나면 NULL을 반환합니다.SELECT ELEMENT_AT(ARRAY(1, 2, 3) , 2);
+--------------------------------+
| ELEMENT_AT(ARRAY(1, 2, 3) , 2) |
+--------------------------------+
| 2 |
+--------------------------------+
SELECT ELEMENT_AT([1, 2, 3] , 3);
+---------------------------+
| ELEMENT_AT([1, 2, 3] , 3) |
+---------------------------+
| 3 |
+---------------------------+
SELECT ELEMENT_AT([["abc", "def"], ["def", "gef"], [3]] , 3);
+-------------------------------------------------------+
| ELEMENT_AT([["abc", "def"], ["def", "gef"], [3]] , 3) |
+-------------------------------------------------------+
| ["3"] |
+-------------------------------------------------------+
비교 관계
ARRAY는 순서가 있는 타입이므로 [1, 2, 3]과 [3, 2, 1]은 서로 다른 두 ARRAY입니다. 두 ARRAY의 요소를 순서대로 하나씩 비교했을 때 모든 요소가 같은 경우에만 두 ARRAY가 같습니다:
select array(1,2,3) = array(3,2,1);
+-----------------------------+
| array(1,2,3) = array(3,2,1) |
+-----------------------------+
| 0 |
+-----------------------------+
select array(1,2,3) = array(1,2,3);
+-----------------------------+
| array(1,2,3) = array(1,2,3) |
+-----------------------------+
| 1 |
+-----------------------------+
select array(1,2,3) = array(1,2,3,3);
+-------------------------------+
| array(1,2,3) = array(1,2,3,3) |
+-------------------------------+
| 0 |
+-------------------------------+
부분 순서 비교에서 ARRAY는 사전식 순서를 따릅니다. 두 배열 A와 B가 주어지면 인덱스 i = 1부터 시작하여 같은 위치에 있는 요소 A[i]와 B[i]를 비교합니다:
A[i] ≠ B[i]로 서로 다르면 비교 결과(<, >)가 배열 전체의 비교 결과를 바로 결정합니다A[i] = B[i]이면 다음 위치의 요소를 계속 비교합니다- 두 배열의 공통 길이 범위 내 모든 요소가 같으면 길이가 짧은 배열이 더 작습니다.
select array(1,2,3) > array(1,2,3,3), array(1,2,3) < array(1,2,3,3);
+-------------------------------+-------------------------------+
| array(1,2,3) > array(1,2,3,3) | array(1,2,3) < array(1,2,3,3) |
+-------------------------------+-------------------------------+
| 0 | 1 |
+-------------------------------+-------------------------------+
select array(1,3,2) > array(1,2,3), array(1,3,2) < array(1,2,3);
+-----------------------------+-----------------------------+
| array(1,3,2) > array(1,2,3) | array(1,3,2) < array(1,2,3) |
+-----------------------------+-----------------------------+
| 1 | 0 |
+-----------------------------+-----------------------------+
select array(null) < array(-1), array(null) > array(-1);
+-------------------------+-------------------------+
| array(null) < array(-1) | array(null) > array(-1) |
+-------------------------+-------------------------+
| 1 | 0 |
+-------------------------+-------------------------+
쿼리 가속
- Doris 테이블의
ARRAY<T>타입 컬럼에는 역색인을 추가하여 해당 컬럼의ARRAY함수를 사용하는 연산을 가속할 수 있습니다.- 역색인에서 지원하는 T 타입:
BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DECIMAL, DATE, DATETIME, TIMESTAMPTZ, CHAR, VARCHAR, STRING, IPV4, IPV6. - 가속되는
ARRAY함수:ARRAY_CONTAINS,ARRAYS_OVERLAP. 단, 함수 매개변수에 NULL이 포함되면 일반 벡터화 연산으로 전환됩니다.
- 역색인에서 지원하는 T 타입:
예제
-
다차원 배열
-- Create table
CREATE TABLE IF NOT EXISTS array_table (
id INT,
two_dim_array ARRAY<ARRAY<INT>>,
three_dim_array ARRAY<ARRAY<ARRAY<STRING>>>
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1
PROPERTIES (
"replication_num" = "1"
);
-- Insert
INSERT INTO array_table VALUES (1, [[1, 2, 3], [4, 5, 6]], [[['ab', 'cd', 'ef'], ['gh', 'ij', 'kl']], [['mn', 'op', 'qr'], ['st', 'uv', 'wx']]]);
INSERT INTO array_table VALUES (2, ARRAY(ARRAY(1, 2, 3), ARRAY(4, 5, 6)), ARRAY(ARRAY(ARRAY('ab', 'cd', 'ef'), ARRAY('gh', 'ij', 'kl')), ARRAY(ARRAY('mn', 'op', 'qr'), ARRAY('st', 'uv', 'wx'))));
-- Query
SELECT two_dim_array[1][2], three_dim_array[1][1][2] FROM array_table ORDER BY id;
+---------------------+--------------------------+
| two_dim_array[1][2] | three_dim_array[1][1][2] |
+---------------------+--------------------------+
| 2 | cd |
| 2 | cd |
+---------------------+--------------------------+ -
중첩 복합 타입
-- Create table
CREATE TABLE IF NOT EXISTS array_map_table (
id INT,
array_map ARRAY<MAP<STRING, INT>>
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1
PROPERTIES (
"replication_num" = "1"
);
-- Insert
INSERT INTO array_map_table VALUES (1, ARRAY(MAP('key1', 1), MAP('key2', 2)));
INSERT INTO array_map_table VALUES (2, ARRAY(MAP('key1', 1), MAP('key2', 2)));
-- Query
SELECT array_map[1], array_map[2] FROM array_map_table ORDER BY id;
+--------------+--------------+
| array_map[1] | array_map[2] |
+--------------+--------------+
| {"key1":1} | {"key2":2} |
| {"key1":1} | {"key2":2} |
+--------------+--------------+
-- Create table
CREATE TABLE IF NOT EXISTS array_table (
id INT,
array_struct ARRAY<STRUCT<id: INT, name: STRING>>
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1
PROPERTIES (
"replication_num" = "1"
);
INSERT INTO array_table VALUES (1, ARRAY(STRUCT(1, 'John'), STRUCT(2, 'Jane')));
INSERT INTO array_table VALUES (2, ARRAY(STRUCT(1, 'John'), STRUCT(2, 'Jane')));
SELECT array_struct[1], array_struct[2] FROM array_table ORDER BY id;
+-------------------------+-------------------------+
| array_struct[1] | array_struct[2] |
+-------------------------+-------------------------+
| {"id":1, "name":"John"} | {"id":2, "name":"Jane"} |
| {"id":1, "name":"John"} | {"id":2, "name":"Jane"} |
+-------------------------+-------------------------+ -
타입 변경
-- Create table
CREATE TABLE array_table (
id INT,
array_varchar ARRAY<VARCHAR(10)>
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
-- Modify ARRAY type
ALTER TABLE array_table MODIFY COLUMN array_varchar ARRAY<VARCHAR(20)>;
-- Check column type
DESC array_table;
+---------------+--------------------+------+-------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------------+------+-------+---------+-------+
| id | int | Yes | true | NULL | |
| array_varchar | array<varchar(20)> | Yes | false | NULL | NONE |
+---------------+--------------------+------+-------+---------+-------+ -
역색인
-- Create table statement
CREATE TABLE `array_table` (
`k` int NOT NULL,
`array_column` ARRAY<INT>,
INDEX idx_array_column (array_column) USING INVERTED
) ENGINE=OLAP
DUPLICATE KEY(`k`)
DISTRIBUTED BY HASH(`k`) BUCKETS 1
PROPERTIES (
"replication_num" = "1"
);
-- Insert
INSERT INTO array_table VALUES (1, [1, 2, 3]), (2, [4, 5, 6]), (3, [7, 8, 9]);
-- The inverted index accelerates the execution of the ARRAY_CONTAINS function
SELECT * FROM array_table WHERE ARRAY_CONTAINS(array_column, 5);
+------+--------------+
| k | array_column |
+------+--------------+
| 2 | [4, 5, 6] |
+------+--------------+
-- The inverted index accelerates the execution of the ARRAYS_OVERLAP function
SELECT * FROM array_table WHERE ARRAYS_OVERLAP(array_column, [6, 9]);
+------+--------------+
| k | array_column |
+------+--------------+
| 2 | [4, 5, 6] |
| 3 | [7, 8, 9] |
+------+--------------+