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

STRUCT

STRUCT широко используется для выражения сложных типов данных. Он представляет собой коллекцию элементов (также называемых полями) с различными типами данных, например, <a INT, b STRING>.

Имена полей в struct должны быть уникальными. Поля могут быть примитивных типов данных (таких как числовой, строковый или дата) или сложных типов данных (таких как ARRAY или MAP).

Поле внутри struct также может быть другим STRUCT, ARRAY или MAP, что позволяет создавать вложенные структуры данных, например, STRUCT<a INT, b STRUCT<c INT, d INT>, c MAP<INT, INT>, d ARRAY<INT>>.

Тип данных STRUCT поддерживается начиная с версии v1.5.2. В v1.5.2 вы можете определять столбцы STRUCT при создании таблицы Selena, загружать данные STRUCT в эту таблицу и запрашивать данные MAP.

Начиная с v1.5.2, Selena поддерживает запрос сложных типов данных MAP и STRUCT из озер данных. Вы можете использовать внешние каталоги, предоставляемые Selena, для запроса данных MAP и STRUCT из Apache Hive, Apache Hudi и Apache Iceberg. Вы можете запрашивать данные только из файлов ORC и Parquet. Подробнее об использовании внешних каталогов для запроса внешних источников данных см. Обзор каталогов и темы, связанные с требуемым типом каталога.

Синтаксис

STRUCT<name, type>
  • name: имя поля, такое же, как имя столбца, определенное в операторе CREATE TABLE.
  • type: тип поля. Может быть любым поддерживаемым типом.

Определение столбца STRUCT в Selena

Вы можете определить столбец STRUCT при создании таблицы и загружать данные STRUCT в этот столбец.

-- Определение одномерного struct.
CREATE TABLE t0(
c0 INT,
c1 STRUCT<a INT, b INT>
)
DUPLICATE KEY(c0);

-- Определение сложного struct.
CREATE TABLE t1(
c0 INT,
c1 STRUCT<a INT, b STRUCT<c INT, d INT>, c MAP<INT, INT>, d ARRAY<INT>>
)
DUPLICATE KEY(c0);

-- Определение NOT NULL struct.
CREATE TABLE t2(
c0 INT,
c1 STRUCT<a INT, b INT> NOT NULL
)
DUPLICATE KEY(c0);

Столбцы с типом STRUCT имеют следующие ограничения:

  • Не могут использоваться в качестве ключевых столбцов в таблице. Они могут использоваться только как столбцы значений.
  • Не могут использоваться в качестве столбцов ключа partition (после PARTITION BY) в таблице.
  • Не могут использоваться в качестве столбцов bucket (после DISTRIBUTED BY) в таблице.
  • Поддерживают только функцию replace() при использовании в качестве столбца значений в Aggregate-таблице.

Создание struct в SQL

STRUCT можно создать в SQL с помощью следующих функций: row, struct и named_struct. struct() является псевдонимом row().

  • row и struct поддерживают безымянный struct. Вам не нужно указывать имена полей. Selena автоматически генерирует имена столбцов, такие как col1, col2...
  • named_struct поддерживает именованный struct. Выражения имен и значений должны быть в парах.

Selena автоматически определяет тип struct на основе входных значений.

select row(1, 2, 3, 4) as numbers; -- Возвращает {"col1":1,"col2":2,"col3":3,"col4":4}.
select row(1, 2, null, 4) as numbers; -- Возвращает {"col1":1,"col2":2,"col3":null,"col4":4}.
select row(null) as nulls; -- Возвращает {"col1":null}.
select struct(1, 2, 3, 4) as numbers; -- Возвращает {"col1":1,"col2":2,"col3":3,"col4":4}.
select named_struct('a', 1, 'b', 2, 'c', 3, 'd', 4) as numbers; -- Возвращает {"a":1,"b":2,"c":3,"d":4}.

Загрузка данных STRUCT

Вы можете загрузить данные STRUCT в Selena двумя способами: INSERT INTO и загрузка ORC/Parquet.

Обратите внимание, что Selena автоматически приводит тип данных к соответствующему типу STRUCT. При загрузке данных в столбец именованного struct убедитесь, что имена полей внутри struct находятся в том же порядке, что и при создании таблицы.

INSERT INTO

CREATE TABLE t0(
c0 INT,
c1 STRUCT<a INT, b INT>
)
DUPLICATE KEY(c0);

INSERT INTO t0 VALUES(1, row(1, 1));

SELECT * FROM t0;
+------+---------------+
| c0 | c1 |
+------+---------------+
| 1 | {"a":1,"b":1} |
+------+---------------+

Загрузка данных STRUCT из файлов ORC/Parquet

Тип данных STRUCT в Selena соответствует структуре вложенных столбцов в формате ORC или Parquet. Дополнительная спецификация не требуется. Вы можете загрузить данные STRUCT из файлов ORC или Parquet, следуя инструкциям в загрузка ORC/Parquet.

Доступ к полям STRUCT

Для запроса подполя struct вы можете использовать оператор точка (.) для запроса значения по имени поля, или использовать [] для вызова значения по его индексу.

mysql> select named_struct('a', 1, 'b', 2, 'c', 3, 'd', 4).a;
+------------------------------------------------+
| named_struct('a', 1, 'b', 2, 'c', 3, 'd', 4).a |
+------------------------------------------------+
| 1 |
+------------------------------------------------+

mysql> select row(1, 2, 3, 4).col1;
+-----------------------+
| row(1, 2, 3, 4).col1 |
+-----------------------+
| 1 |
+-----------------------+

mysql> select row(2, 4, 6, 8)[2];
+--------------------+
| row(2, 4, 6, 8)[2] |
+--------------------+
| 4 |
+--------------------+

mysql> select row(map{'a':1}, 2, 3, 4)[1];
+-----------------------------+
| row(map{'a':1}, 2, 3, 4)[1] |
+-----------------------------+
| {"a":1} |
+-----------------------------+