Перейти к основному содержимому

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 (с версии v3.1), MAP (с версии v3.1) и STRUCT (с версии v3.1).

Элементы в массиве по умолчанию могут быть 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:

  • В версиях ранее v2.1 вы можете создавать столбцы ARRAY только в таблицах Duplicate Key. Начиная с v2.1, вы также можете создавать столбцы ARRAY в других типах таблиц (Primary Key, Unique Key, Aggregate). Обратите внимание, что в таблице Aggregate вы можете создать столбец ARRAY только когда функция, используемая для агрегации данных в этом столбце, является replace() или replace_if_not_null(). Для получения дополнительной информации см. Aggregate table.
  • Столбцы ARRAY нельзя использовать как ключевые столбцы.
  • Столбцы ARRAY нельзя использовать как ключи разделов (включенные в PARTITION BY) или ключи группировки (включенные в DISTRIBUTED BY).
  • DECIMAL V3 не поддерживается в ARRAY.
  • Массив может иметь максимум 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

Тип array в 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)