15 KiB
sidebar_position | sidebar_label |
---|---|
46 | Работа с контейнерами map |
Функции для работы с контейнерами map
map
Преобразовывает пары ключ:значение
в тип данных Map(key, value).
Синтаксис
map(key1, value1[, key2, value2, ...])
Аргументы
key
— ключ. String, Integer, LowCardinality, FixedString, UUID, Date, DateTime, Date32, Enum.value
— значение. Любой тип, включая Map и Array.
Возвращаемое значение
- Структура данных в виде пар
ключ:значение
.
Тип: Map(key, value).
Примеры
Запрос:
SELECT map('key1', number, 'key2', number * 2) FROM numbers(3);
Результат:
┌─map('key1', number, 'key2', multiply(number, 2))─┐
│ {'key1':0,'key2':0} │
│ {'key1':1,'key2':2} │
│ {'key1':2,'key2':4} │
└──────────────────────────────────────────────────┘
Запрос:
CREATE TABLE table_map (a Map(String, UInt64)) ENGINE = MergeTree() ORDER BY a;
INSERT INTO table_map SELECT map('key1', number, 'key2', number * 2) FROM numbers(3);
SELECT a['key2'] FROM table_map;
Результат:
┌─arrayElement(a, 'key2')─┐
│ 0 │
│ 2 │
│ 4 │
└─────────────────────────┘
Смотрите также
- тип данных Map(key, value)
mapAdd
Собирает все ключи и суммирует соответствующие значения.
Синтаксис
mapAdd(arg1, arg2 [, ...])
Аргументы
Аргументами являются контейнеры Map или кортежи из двух массивов, где элементы в первом массиве представляют ключи, а второй массив содержит значения для каждого ключа. Все массивы ключей должны иметь один и тот же тип, а все массивы значений должны содержать элементы, которые можно приводить к одному типу (Int64, UInt64 или Float64). Общий приведенный тип используется в качестве типа для результирующего массива.
Возвращаемое значение
- В зависимости от типа аргументов возвращает один Map или кортеж, в котором первый массив содержит отсортированные ключи, а второй — значения.
Пример
Запрос с кортежем:
SELECT mapAdd(([toUInt8(1), 2], [1, 1]), ([toUInt8(1), 2], [1, 1])) as res, toTypeName(res) as type;
Результат:
┌─res───────────┬─type───────────────────────────────┐
│ ([1,2],[2,2]) │ Tuple(Array(UInt8), Array(UInt64)) │
└───────────────┴────────────────────────────────────┘
Запрос с контейнером Map
:
SELECT mapAdd(map(1,1), map(1,1));
Результат:
┌─mapAdd(map(1, 1), map(1, 1))─┐
│ {1:2} │
└──────────────────────────────┘
mapSubtract
Собирает все ключи и вычитает соответствующие значения.
Синтаксис
mapSubtract(Tuple(Array, Array), Tuple(Array, Array) [, ...])
Аргументы
Аргументами являются контейнеры Map или кортежи из двух массивов, где элементы в первом массиве представляют ключи, а второй массив содержит значения для каждого ключа. Все массивы ключей должны иметь один и тот же тип, а все массивы значений должны содержать элементы, которые можно приводить к одному типу (Int64, UInt64 или Float64). Общий приведенный тип используется в качестве типа для результирующего массива.
Возвращаемое значение
- В зависимости от аргумента возвращает один Map или кортеж, в котором первый массив содержит отсортированные ключи, а второй — значения.
Пример
Запрос:
SELECT mapSubtract(([toUInt8(1), 2], [toInt32(1), 1]), ([toUInt8(1), 2], [toInt32(2), 1])) as res, toTypeName(res) as type;
Результат:
┌─res────────────┬─type──────────────────────────────┐
│ ([1,2],[-1,0]) │ Tuple(Array(UInt8), Array(Int64)) │
└────────────────┴───────────────────────────────────┘
Запрос с контейнером Map
:
SELECT mapSubtract(map(1,1), map(1,1));
Результат:
┌─mapSubtract(map(1, 1), map(1, 1))─┐
│ {1:0} │
└───────────────────────────────────┘
mapPopulateSeries
Заполняет недостающие ключи в контейнере map (пара массивов ключей и значений), где ключи являются целыми числами. Кроме того, он поддерживает указание максимального ключа, который используется для расширения массива ключей.
Синтаксис
mapPopulateSeries(keys, values[, max])
mapPopulateSeries(map[, max])
Генерирует контейнер map, где ключи - это серия чисел, от минимального до максимального ключа (или аргумент max
, если он указан), взятых из массива keys
с размером шага один, и соответствующие значения, взятые из массива values
. Если значение не указано для ключа, то в результирующем контейнере используется значение по умолчанию.
Количество элементов в keys
и values
должно быть одинаковым для каждой строки.
Аргументы
Аргументами являются контейнер Map или два массива, где первый массив представляет ключи, а второй массив содержит значения для каждого ключа.
Сопоставленные массивы:
keys
— массив ключей. Array(Int).values
— массив значений. Array(Int).max
— максимальное значение ключа. Необязательный параметр. Int8, Int16, Int32, Int64, Int128, Int256.
или
map
— контейнерMap
с целочисленными ключами. Map.
Возвращаемое значение
- В зависимости от аргумента возвращает контейнер Map или кортеж из двух массивов: ключи отсортированные по порядку и значения соответствующих ключей.
Пример
Запрос с сопоставленными массивами:
SELECT mapPopulateSeries([1,2,4], [11,22,44], 5) AS res, toTypeName(res) AS type;
Результат:
┌─res──────────────────────────┬─type──────────────────────────────┐
│ ([1,2,3,4,5],[11,22,0,44,0]) │ Tuple(Array(UInt8), Array(UInt8)) │
└──────────────────────────────┴───────────────────────────────────┘
Запрос с контейнером Map
:
SELECT mapPopulateSeries(map(1, 10, 5, 20), 6);
Результат:
┌─mapPopulateSeries(map(1, 10, 5, 20), 6)─┐
│ {1:10,2:0,3:0,4:0,5:20,6:0} │
└─────────────────────────────────────────┘
mapContains
Определяет, содержит ли контейнер map
ключ key
.
Синтаксис
mapContains(map, key)
Аргументы
map
— контейнер Map. Map.key
— ключ. Тип соответстует типу ключей параметраmap
.
Возвращаемое значение
1
еслиmap
включаетkey
, иначе0
.
Тип: UInt8.
Пример
Запрос:
CREATE TABLE test (a Map(String,String)) ENGINE = Memory;
INSERT INTO test VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});
SELECT mapContains(a, 'name') FROM test;
Результат:
┌─mapContains(a, 'name')─┐
│ 1 │
│ 0 │
└────────────────────────┘
mapKeys
Возвращает все ключи контейнера map
.
Функцию можно оптимизировать, если включить настройку optimize_functions_to_subcolumns. При optimize_functions_to_subcolumns = 1
функция читает только подстолбец keys вместо чтения и обработки данных всего столбца. Запрос SELECT mapKeys(m) FROM table
преобразуется к запросу SELECT m.keys FROM table
.
Синтаксис
mapKeys(map)
Аргументы
map
— контейнер Map. Map.
Возвращаемое значение
- Массив со всеми ключами контейнера
map
.
Тип: Array.
Пример
Запрос:
CREATE TABLE test (a Map(String,String)) ENGINE = Memory;
INSERT INTO test VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});
SELECT mapKeys(a) FROM test;
Результат:
┌─mapKeys(a)────────────┐
│ ['name','age'] │
│ ['number','position'] │
└───────────────────────┘
mapValues
Возвращает все значения контейнера map
.
Функцию можно оптимизировать, если включить настройку optimize_functions_to_subcolumns. При optimize_functions_to_subcolumns = 1
функция читает только подстолбец values вместо чтения и обработки данных всего столбца. Запрос SELECT mapValues(m) FROM table
преобразуется к запросу SELECT m.values FROM table
.
Синтаксис
mapKeys(map)
Аргументы
map
— контейнер Map. Map.
Возвращаемое значение
- Массив со всеми значениями контейнера
map
.
Тип: Array.
Примеры
Запрос:
CREATE TABLE test (a Map(String,String)) ENGINE = Memory;
INSERT INTO test VALUES ({'name':'eleven','age':'11'}), ({'number':'twelve','position':'6.0'});
SELECT mapValues(a) FROM test;
Результат:
┌─mapValues(a)─────┐
│ ['eleven','11'] │
│ ['twelve','6.0'] │
└──────────────────┘