Перейти к основному содержимому
Версия: 2.0.x

ARRAY

ARRAY, как расширенный тип базы данных, поддерживается в различных системах баз данных, таких как PostgreSQL, ClickHouse и Snowflake. ARRAY широко используется в таких сценариях, как A/B-тесты, анализ пользовательских тегов и профилирование пользователей. Selena поддерживает вложенность многомерных массивов, срезы массивов, сравнение и фильтрацию.

Определение столбцов ARRAY​

Вы можете определить столбец ARRAY при создании таблицы.

-- Определение одномерного массива.
ARRAY<type>

-- Определение вложенного массива.
ARRAY<ARRAY<type>>

-- Определение столбца массива как NOT NULL.
ARRAY<type> NOT NULL

type указывает типы данных элементов в массиве. Selena поддерживает следующие типы элементов: BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, VARCHAR, CHAR, DATETIME, DATE, JSON, ARRAY (начиная с v1.5.2), MAP (начиная с v1.5.2) и STRUCT (начиная с v1.5.2).

Элементы в массиве по умолчанию допускают значение null, например, [null, 1 ,2]. Вы не можете указать элементы в массиве как NOT NULL. Однако вы можете указать столбец ARRAY как NOT NULL при создании таблицы, как в третьем примере в следующем фрагменте кода.

Примеры:

-- Определите c1 как одномерный массив с типом элемента INT.
create table t0(
c0 INT,
c1 ARRAY<INT>
)
duplicate key(c0)
distributed by hash(c0);

-- Определите c1 как вложенный массив с типом элемента VARCHAR.
create table t1(
c0 INT,
c1 ARRAY<ARRAY<VARCHAR(10)>>
)
duplicate key(c0)
distributed by hash(c0);

-- Определите c1 как столбец массива NOT NULL.
create table t2(
c0 INT,
c1 ARRAY<INT> NOT NULL
)
duplicate key(c0)
distributed by hash(c0);

Ограничения​

При создании столбцов ARRAY в таблицах Selena применяются следующие ограничения:

  • В версиях до v1.5.2 вы можете создавать столбцы ARRAY только в таблицах Duplicate Key. Начиная с v1.5.2 вы также можете создавать столбцы ARRAY в таблицах других типов (Primary Key, Unique Key, Aggregate). Обратите внимание, что в Aggregate-таблице вы можете создать столбец ARRAY только тогда, когда функция, используемая для агрегации данных в этом столбце, - replace() или replace_if_not_null(). Подробнее см. Aggregate-таблица.
  • Столбцы ARRAY не могут использоваться в качестве ключевых столбцов.
  • Столбцы ARRAY не могут использоваться в качестве ключей partition (включены в PARTITION BY) или ключей bucket (включены в DISTRIBUTED BY).
  • Массив может иметь максимум 14 уровней вложенности.

Создание массивов в SQL​

Массивы можно создавать в SQL с помощью квадратных скобок [], где каждый элемент массива разделяется запятой (,).

mysql> select [1, 2, 3] as numbers;

+---------+
| numbers |
+---------+
| [1,2,3] |
+---------+

mysql> select ["apple", "orange", "pear"] as fruit;

+---------------------------+
| fruit |
+---------------------------+
| ["apple","orange","pear"] |
+---------------------------+

mysql> select [true, false] as booleans;

+----------+
| booleans |
+----------+
| [1,0] |
+----------+

Selena автоматически определяет типы данных, если массив состоит из элементов нескольких типов:

mysql> select [1, 1.2] as floats;
+---------+
| floats |
+---------+
| [1.0,1.2] |
+---------+

mysql> select [12, "100"];

+--------------+
| [12,'100'] |
+--------------+
| ["12","100"] |
+--------------+

Вы можете использовать угловые скобки (<>) для указания объявленного типа массива.

mysql> select ARRAY<float>[1, 2];

+-----------------------+
| ARRAY<float>[1.0,2.0] |
+-----------------------+
| [1,2] |
+-----------------------+

mysql> select ARRAY<INT>["12", "100"];

+------------------------+
| ARRAY<int(11)>[12,100] |
+------------------------+
| [12,100] |
+------------------------+

NULL может быть включен в элемент.

mysql> select [1, NULL];

+----------+
| [1,NULL] |
+----------+
| [1,null] |
+----------+

Для пустого массива вы можете использовать угловые скобки для указания объявленного типа, или вы можете написать [] напрямую, чтобы Selena определила тип на основе контекста. Если Selena не может определить тип, она сообщит об ошибке.

mysql> select [];

+------+
| [] |
+------+
| [] |
+------+

mysql> select ARRAY<VARCHAR(10)>[];

+----------------------------------+
| ARRAY<unknown type: NULL_TYPE>[] |
+----------------------------------+
| [] |
+----------------------------------+

mysql> select array_append([], 10);

+----------------------+
| array_append([], 10) |
+----------------------+
| [10] |
+----------------------+

Загрузка данных Array​

Selena поддерживает загрузку данных Array тремя способами:

  • INSERT INTO подходит для загрузки небольших объемов данных для тестирования.
  • Broker Load подходит для загрузки файлов ORC или Parquet с большими объемами данных.
  • Stream Load и Routine Load подходят для загрузки CSV-файлов с большими объемами данных.

Использование INSERT INTO для загрузки массивов​

Вы можете использовать INSERT INTO для загрузки небольших объемов данных столбец за столбцом или выполнить ETL над данными перед их загрузкой.

create table t0(
c0 INT,
c1 ARRAY<INT>
)
duplicate key(c0)
distributed by hash(c0);

INSERT INTO t0 VALUES(1, [1,2,3]);

Использование Broker Load для загрузки массивов из файлов ORC или Parquet​

Тип массива в Selena соответствует структуре list в файлах ORC и Parquet, что избавляет от необходимости указывать разные типы данных в Selena. Подробнее о загрузке данных см. Broker load.

Использование Stream Load или Routine Load для загрузки массивов в формате CSV​

Массивы в CSV-файлах по умолчанию разделяются запятой. Вы можете использовать Stream Load или Routine Load для загрузки текстовых файлов CSV или данных CSV в Kafka.

Запрос данных ARRAY​

Вы можете получить доступ к элементам массива с помощью [] и индексов, начиная с 1.

mysql> select [1,2,3][1];

+------------+
| [1,2,3][1] |
+------------+
| 1 |
+------------+
1 row in set (0.00 sec)

Если индекс равен 0 или отрицательному числу, ошибка не выводится и возвращается NULL.

mysql> select [1,2,3][0];

+------------+
| [1,2,3][0] |
+------------+
| NULL |
+------------+
1 row in set (0.01 sec)

Если индекс превышает длину массива (количество элементов в массиве), будет возвращен NULL.

mysql> select [1,2,3][4];

+------------+
| [1,2,3][4] |
+------------+
| NULL |
+------------+
1 row in set (0.01 sec)

Для многомерных массивов к элементам можно обращаться рекурсивно.

mysql(ARRAY)> select [[1,2],[3,4]][2];

+------------------+
| [[1,2],[3,4]][2] |
+------------------+
| [3,4] |
+------------------+
1 row in set (0.00 sec)

mysql> select [[1,2],[3,4]][2][1];

+---------------------+
| [[1,2],[3,4]][2][1] |
+---------------------+
| 3 |
+---------------------+
1 row in set (0.01 sec)