MAP
MAP - это сложный тип данных, который хранит набор пар ключ-значение, например, {a:1, b:2, c:3}. Ключи в map должны быть уникальными. Вложенный map может содержать до 14 уровней вложенности.
Тип данных MAP поддерживается начиная с версии v1.5.2. В v1.5.2 вы можете определять столбцы MAP при создании таблицы Selena, загружать данные MAP в эту таблицу и запрашивать данные MAP.
Начиная с v1.5.2, Selena поддерживает запрос сложных типов данных MAP и STRUCT из озер данных. Вы можете использовать внешние каталоги, предоставляемые Selena, для запроса данных MAP и STRUCT из Apache Hive, Apache Hudi и Apache Iceberg. Вы можете запрашивать данные только из файлов ORC и Parquet. Подробнее об использовании внешних каталогов для запроса внешних источников данных см. Обзор каталогов и темы, связанные с требуемым типом каталога.
Синтаксис
MAP<key_type,value_type>
key_type: тип данных ключа. Ключ должен быть примитивного типа, поддерживаемого Selena, такого как числовой, строковый или дата. Он не может быть типа HLL, JSON, ARRAY, MAP, BITMAP или STRUCT.value_type: тип данных значения. Значение может быть любого поддерживаемого типа.
Ключи и значения по умолчанию допускают null.
Определение столбца MAP в Selena
Вы можете определить столбец MAP при создании таблицы и загружать данные MAP в этот столбец.
-- Определение одномерного map.
CREATE TABLE t0(
c0 INT,
c1 MAP<INT,INT>
)
DUPLICATE KEY(c0);
-- Определение вложенного map.
CREATE TABLE t1(
c0 INT,
c1 MAP<DATE, MAP<VARCHAR(10), INT>>
)
DUPLICATE KEY(c0);
-- Определение NOT NULL map.
CREATE TABLE t2(
c0 INT,
c1 MAP<INT,DATETIME> NOT NULL
)
DUPLICATE KEY(c0);
Столбцы с типом MAP имеют следующие ограничения:
- Не могут использоваться в качестве ключевых столбцов в таблице. Они могут использоваться только как столбцы значений.
- Не могут использоваться в качестве столбцов ключа partition (столбцы после PARTITION BY) в таблице.
- Не могут использоваться в качестве столбцов bucket (столбцы после DISTRIBUTED BY) в таблице.
Создание map в SQL
Map можно создать в SQL, используя два следующих синтаксиса:
-
map{key_expr:value_expr, ...}: Элементы map разделяются запятой (,), а ключи и значения разделяются двоеточием (:), например,map{a:1, b:2, c:3}. -
map(key_expr, value_expr ...): Выражения ключей и значений должны быть в парах, например,map(a,1,b,2,c,3).
Selena может определить типы данных ключей и значений из всех входных ключей и значений.
select map{1:1, 2:2, 3:3} as numbers;
select map(1,1,2,2,3,3) as numbers; -- Возвращает {1:1,2:2,3:3}.
select map{1:"apple", 2:"orange", 3:"pear"} as fruit;
select map(1, "apple", 2, "orange", 3, "pear") as fruit; -- Возвращает {1:"apple",2:"orange",3:"pear"}.
select map{true:map{3.13:"abc"}, false:map{}} as nest;
select map(true, map(3.13, "abc"), false, map{}) as nest; -- Возвращает {1:{3.13:"abc"},0:{}}.
Если ключи или значения имеют разные типы, Selena автоматически определяет соответствующий тип (супертип).
select map{1:2.2, 1.2:21} as floats_floats; -- Возвращает {1.0:2.2,1.2:21.0}.
select map{12:"a", "100":1, NULL:NULL} as string_string; -- Возвращает {"12":"a","100":"1",null:null}.
Вы также можете определить тип данных с помощью <> при создании map. Входные ключи или значения должны иметь возможность приведения к указанным типам.
select map<FLOAT,INT>{1:2}; -- Возвращает {1:2}.
select map<INT,INT>{"12": "100"}; -- Возвращает {12:100}.
Ключи и значения допускают null.
select map{1:NULL};
Создание пустых map.
select map{} as empty_map;
select map() as empty_map; -- Возвращает {}.