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

STRUCT

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

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

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

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

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

Синтаксис

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

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

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

-- Определение одномерной структуры.
CREATE TABLE t0(
c0 INT,
c1 STRUCT<a INT, b INT>
)
DUPLICATE KEY(c0);

-- Определение сложной структуры.
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.
CREATE TABLE t2(
c0 INT,
c1 STRUCT<a INT, b INT> NOT NULL
)
DUPLICATE KEY(c0);

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

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

Создание структур в SQL

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

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

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

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. При загрузке данных в столбец именованной структуры убедитесь, что имена полей внутри структуры находятся в том же порядке, что и указано при создании таблицы.

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

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

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} |
+-----------------------------+