Перейти к основному содержимому
Версия: 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)