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

Функции Map

extractKeyValuePairs

Введено в: v

Извлекает пары ключ-значение из произвольной строки. Строка не обязана строго соответствовать формату пар ключ-значение;

она может содержать «шум» (например, файлы журналов / логи). Формат пар ключ-значение, который нужно интерпретировать, задаётся через аргументы функции.

Пара ключ-значение состоит из ключа, за которым следует key_value_delimiter, и значения. Также поддерживаются ключи и значения, заключённые в кавычки. Пары ключ-значение должны быть разделены разделителями пар ключ-значение.

Синтаксис

            extractKeyValuePairs(data, [key_value_delimiter], [pair_delimiter], [quoting_character])

Аргументы

  • data - Строка, из которой извлекаются пары ключ-значение. String или FixedString.
    • key_value_delimiter - Символ, используемый в качестве разделителя между ключом и значением. По умолчанию :. String или FixedString.
    • pair_delimiters - Набор символов, используемых в качестве разделителей между парами. По умолчанию \space, , и ;. String или FixedString.
    • quoting_character - Символ, используемый в качестве символа кавычек. По умолчанию ". String или FixedString.
    • unexpected_quoting_character_strategy - Стратегия обработки символов кавычек в неожиданных местах во время фаз read_key и read_value. Возможные значения: invalid, accept и promote. invalid отбросит ключ/значение и вернёт состояние WAITING_KEY. accept будет трактовать его как обычный символ. promote переведёт в состояние READ_QUOTED_{KEY/VALUE} и начнёт со следующего символа. Значение по умолчанию — INVALID.

Возвращаемые значения

  • Извлечённые пары ключ-значение в Map(String, String).

Примеры

Запрос:

Простой пример

            arthur :) select extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil') as kv

            SELECT extractKeyValuePairs('name:neymar, age:31 team:psg,nationality:brazil') as kv

            Query id: f9e0ca6f-3178-4ee2-aa2c-a5517abb9cee

            ┌─kv──────────────────────────────────────────────────────────────────────┐
            │ {'name':'neymar','age':'31','team':'psg','nationality':'brazil'}        │
            └─────────────────────────────────────────────────────────────────────────┘

Одинарная кавычка как символ обрамления

            arthur :) select extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'') as kv

            SELECT extractKeyValuePairs('name:\'neymar\';\'age\':31;team:psg;nationality:brazil,last_key:last_value', ':', ';,', '\'') as kv

            Идентификатор запроса: 0e22bf6b-9844-414a-99dc-32bf647abd5e

            ┌─kv───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
            │ {'name':'neymar','age':'31','team':'psg','nationality':'brazil','last_key':'last_value'}                                 │
            └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

Примеры unexpected_quoting_character_strategy:

unexpected_quoting_character_strategy=invalid

            SELECT extractKeyValuePairs('name"abc:5', ':', ' ,;', '\"', 'INVALID') as kv;
            ┌─kv────────────────┐
            │ {'abc':'5'}  │
            └───────────────────┘
            SELECT extractKeyValuePairs('name"abc":5', ':', ' ,;', '\"', 'INVALID') as kv;
            ┌─kv──┐
            │ {}  │
            └─────┘

unexpected_quoting_character_strategy=accept

            SELECT extractKeyValuePairs('name"abc:5', ':', ' ,;', '\"', 'ACCEPT') as kv;
            ┌─kv────────────────┐
            │ {'name"abc':'5'}  │
            └───────────────────┘
            SELECT extractKeyValuePairs('name"abc":5', ':', ' ,;', '\"', 'ACCEPT') as kv;
            ┌─kv─────────────────┐
            │ {'name"abc"':'5'}  │
            └────────────────────┘

unexpected_quoting_character_strategy=promote

            SELECT extractKeyValuePairs('name"abc:5', ':', ' ,;', '\"', 'PROMOTE') as kv;
            ┌─kv──┐
            │ {}  │
            └─────┘
            SELECT extractKeyValuePairs('name"abc":5', ':', ' ,;', '\"', 'PROMOTE') as kv;
            ┌─kv───────────┐
            │ {'abc':'5'}  │
            └──────────────┘

Escape-последовательности при отключённой поддержке экранирования

            arthur :) select extractKeyValuePairs('age:a\\x0A\\n\\0') as kv

            SELECT extractKeyValuePairs('age:a\\x0A\\n\\0') AS kv

            Query id: e9fd26ee-b41f-4a11-b17f-25af6fd5d356

            ┌─kv────────────────────┐
            │ {'age':'a\\x0A\\n\\0'} │
            └───────────────────────┘

Синтаксис

Псевдонимы: str_to_map, mapFromString

Аргументы

  • Отсутствуют.

Возвращаемое значение

Примеры

extractKeyValuePairsWithEscaping

Введена в: v

Та же функция, что и extractKeyValuePairs, но с поддержкой экранирования.

Поддерживаемые последовательности экранирования: \x, \N, \a, \b, \e, \f, \n, \r, \t, \v и \0. Нестандартные последовательности экранирования возвращаются без изменений (включая обратный слеш), за исключением следующих: \\, ', ", backtick, /, = или управляющие символы ASCII (c <= 31).

Эта функция подходит для случаев, когда предварительное и последующее экранирование неприменимы. Например, рассмотрим следующую входную строку: a: "aaaa\"bbb". Ожидаемый результат: a: aaaa\"bbbb.

  • Предварительное экранирование: при предварительном экранировании результат будет: a: "aaaa"bbb", а затем extractKeyValuePairs вернёт: a: aaaa
    • Последующее экранирование: extractKeyValuePairs вернёт a: aaaa\, и последующее экранирование сохранит это без изменений.

Начальные последовательности экранирования в ключах будут пропущены и будут считаться недопустимыми для значений.

Последовательности экранирования при включённой поддержке экранирования

            arthur :) select extractKeyValuePairsWithEscaping('age:a\\x0A\\n\\0') as kv

            SELECT extractKeyValuePairsWithEscaping('age:a\\x0A\\n\\0') AS kv

            Query id: 44c114f0-5658-4c75-ab87-4574de3a1645

            ┌─kv───────────────┐
            │ {'age':'a\n\n\0'} │
            └──────────────────┘

Синтаксис

Аргументы

  • Нет.

Возвращаемое значение

Примеры

map

Добавлена в: v21.1

Создаёт значение типа Map(key, value) из пар ключ–значение.

Синтаксис

map(key1, value1[, key2, value2, ...])

Аргументы

  • key_n — ключи элементов map. Any
  • value_n — значения элементов map. Any

Возвращаемое значение

Возвращает map с парами ключ:значение. Map(Any, Any)

Примеры

Пример использования

SELECT map('key1', number, 'key2', number * 2) FROM numbers(3)
{'key1':0,'key2':0}
{'key1':1,'key2':2}
{'key1':2,'key2':4}

mapAdd

Добавлена в версии: v20.7

Собирает все ключи и суммирует соответствующие значения.

Синтаксис

mapAdd(arg1[, arg2, ...])

Аргументы

  • arg1[, arg2, ...] — значения типов Map или Tuple из двух массивов, в которых элементы первого массива представляют ключи, а второй массив содержит значения для каждого ключа. Map(K, V) или Tuple(Array(T), Array(T))

Возвращаемое значение

Возвращает значение типа Map или Tuple, где первый массив содержит отсортированные ключи, а второй массив — соответствующие им значения. Map(K, V) или Tuple(Array(T), Array(T))

Примеры

Для типа Map

SELECT mapAdd(map(1, 1), map(1, 1))
{1:2}

С использованием кортежа

SELECT mapAdd(([toUInt8(1), 2], [1, 1]), ([toUInt8(1), 2], [1, 1]))
([1, 2], [2, 2])

mapAll

Введена в: v23.4

Проверяет, выполняется ли условие для всех пар ключ–значение в map. mapAll — это функция высшего порядка. В качестве первого аргумента ей можно передать лямбда-функцию.

Синтаксис

mapAll([func,] map)

Аргументы

  • func — лямбда-функция. Lambda function
  • map — проверяемая структура Map. Map(K, V)

Возвращаемое значение

Возвращает 1, если все пары ключ-значение удовлетворяют условию, иначе 0. UInt8

Примеры

Пример использования

SELECT mapAll((k, v) -> v = 1, map('k1', 1, 'k2', 2))
0

mapApply

Впервые представлена в: v22.3

Применяет функцию к каждому элементу map.

Синтаксис

mapApply(func, map)

Аргументы

  • func — лямбда-функция. Lambda function
  • map — map, к которому применяется функция. Map(K, V)

Возвращаемое значение

Возвращает новый map, полученный из исходного map посредством применения func к каждому элементу. Map(K, V)

Примеры

Пример использования

SELECT mapApply((k, v) -> (k, v * 2), map('k1', 1, 'k2', 2))
{'k1':2,'k2':4}

mapConcat

Появилась в версии: v23.4

Объединяет несколько значений типа Map по совпадающим ключам. Если элементы с одинаковым ключом присутствуют более чем в одном входном значении Map, все элементы добавляются в результирующее значение Map, но через оператор [] доступен только первый.

Синтаксис

mapConcat(maps)

Аргументы

  • maps — произвольное количество отображений типа Map.

Возвращаемое значение

Возвращает Map, полученный объединением карт, переданных в качестве аргументов. Map

Примеры

Пример использования

SELECT mapConcat(map('k1', 'v1'), map('k2', 'v2'))
{'k1':'v1','k2':'v2'}

mapContainsKey

Введена в версии: v21.2

Определяет, содержится ли ключ в map.

Синтаксис

mapContains(map, key)

Псевдонимы: mapContains

Аргументы

  • map — отображение, в котором выполняется поиск. Map(K, V)
  • key — ключ для поиска. Тип должен совпадать с типом ключа отображения. Any

Возвращаемое значение

Возвращает 1, если отображение содержит ключ, и 0, если не содержит. UInt8

Примеры

Пример использования

SELECT mapContainsKey(map('k1', 'v1', 'k2', 'v2'), 'k1')
1

mapContainsKeyLike

Добавлено в версии: v23.4

Проверяет, содержит ли map ключ, соответствующий заданному шаблону LIKE.

Синтаксис

mapContainsKeyLike(map, pattern)

Аргументы

  • map — Карта, в которой выполняется поиск. Map(K, V)
  • pattern — Шаблон для сопоставления с ключами. const String

Возвращаемое значение

Возвращает 1, если map содержит ключ, соответствующий pattern, иначе 0. UInt8

Примеры

Пример использования

CREATE TABLE tab (a Map(String, String))
ENGINE = MergeTree
ORDER BY tuple();

INSERT INTO tab VALUES ({'abc':'abc','def':'def'}), ({'hij':'hij','klm':'klm'});

SELECT mapContainsKeyLike(a, 'a%') FROM tab;
┌─mapContainsKeyLike(a, 'a%')─┐
│                           1 │
│                           0 │
└─────────────────────────────┘

mapContainsValue

Впервые представлена в: v25.6

Определяет, содержится ли значение в отображении (map).

Синтаксис

mapContainsValue(map, value)

Аргументы

  • map — отображение, в котором выполняется поиск. Map(K, V)
  • value — значение, которое требуется найти. Тип должен совпадать с типом значений отображения. Any

Возвращаемое значение

Возвращает 1, если отображение содержит это значение, и 0 в противном случае. UInt8

Примеры

Пример использования

SELECT mapContainsValue(map('k1', 'v1', 'k2', 'v2'), 'v1')
1

mapContainsValueLike

Впервые появилась в версии: v25.5

Проверяет, содержит ли отображение (map) значение, соответствующее шаблону LIKE.

Синтаксис

mapContainsValueLike(map, pattern)

Аргументы

  • map — карта, в которой выполняется поиск. Map(K, V)
  • pattern — шаблон для сопоставления значений. const String

Возвращаемое значение

Возвращает 1, если map содержит значение, соответствующее pattern, иначе 0. UInt8

Примеры

Пример использования

CREATE TABLE tab (a Map(String, String))
ENGINE = MergeTree
ORDER BY tuple();

INSERT INTO tab VALUES ({'abc':'abc','def':'def'}), ({'hij':'hij','klm':'klm'});

SELECT mapContainsValueLike(a, 'a%') FROM tab;
┌─mapContainsV⋯ke(a, 'a%')─┐
│                        1 │
│                        0 │
└──────────────────────────┘

mapExists

Введена в версии: v23.4

Проверяет, выполняется ли условие хотя бы для одной пары ключ–значение в типе данных Map. mapExists — это функция высшего порядка. В качестве первого аргумента ей можно передать лямбда-функцию.

Синтаксис

mapExists([func,] map)

Аргументы

  • func — необязательный параметр. Лямбда-функция. Lambda function
  • map — отображение для проверки. Map(K, V)

Возвращаемое значение

Возвращает 1, если хотя бы одна пара ключ-значение удовлетворяет условию, иначе 0. UInt8

Примеры

Пример использования

SELECT mapExists((k, v) -> v = 1, map('k1', 1, 'k2', 2))
1

mapExtractKeyLike

Добавлена в версии v23.4

Для карты со строковыми ключами и шаблоном LIKE эта функция возвращает карту с элементами, ключи которых соответствуют шаблону.

Синтаксис

mapExtractKeyLike(map, pattern)

Аргументы

  • map — Карта, из которой выполняется извлечение. Map(K, V)
  • pattern — Шаблон для сопоставления с ключами карты. const String

Возвращаемое значение

Возвращает карту, содержащую элементы, ключ которых соответствует указанному шаблону. Если ни один элемент не соответствует шаблону, возвращается пустая карта. Map(K, V)

Примеры

Пример использования

CREATE TABLE tab (a Map(String, String))
ENGINE = MergeTree
ORDER BY tuple();

INSERT INTO tab VALUES ({'abc':'abc','def':'def'}), ({'hij':'hij','klm':'klm'});

SELECT mapExtractKeyLike(a, 'a%') FROM tab;
┌─mapExtractKeyLike(a, 'a%')─┐
│ {'abc':'abc'}              │
│ {}                         │
└────────────────────────────┘

mapExtractValueLike

Впервые появилась в: v25.5

Для заданного map со строковыми значениями и шаблоном LIKE эта функция возвращает map с элементами, значения которых соответствуют шаблону.

Синтаксис

mapExtractValueLike(map, pattern)

Аргументы

  • map — карта, из которой выполняется извлечение. Map(K, V)
  • pattern — шаблон для сопоставления значений. const String

Возвращаемое значение

Возвращает карту, содержащую элементы, значение которых соответствует указанному шаблону. Если ни один элемент не соответствует шаблону, возвращается пустая карта. Map(K, V)

Примеры

Пример использования

CREATE TABLE tab (a Map(String, String))
ENGINE = MergeTree
ORDER BY tuple();

INSERT INTO tab VALUES ({'abc':'abc','def':'def'}), ({'hij':'hij','klm':'klm'});

SELECT mapExtractValueLike(a, 'a%') FROM tab;
┌─mapExtractValueLike(a, 'a%')─┐
│ {'abc':'abc'}                │
│ {}                           │
└──────────────────────────────┘

mapFilter

Появилась в версии: v22.3

Фильтрует map, применяя функцию к каждому её элементу.

Синтаксис

mapFilter(func, map)

Аргументы

  • func — лямбда-функция. Lambda function
  • map — отображение (map), которое нужно отфильтровать. Map(K, V)

Возвращаемое значение

Возвращает отображение (map), содержащее только те элементы, для которых func возвращает значение, отличное от 0. Map(K, V)

Примеры

Пример использования

SELECT mapFilter((k, v) -> v > 1, map('k1', 1, 'k2', 2))
{'k2':2}

mapFromArrays

Введена в версии: v23.3

Создаёт Map из массива или Map с ключами и массива или Map со значениями. Функция является удобной альтернативой синтаксису CAST([...], 'Map(key_type, value_type)').

Синтаксис

mapFromArrays(keys, values)

Псевдонимы: MAP_FROM_ARRAYS

Аргументы

  • keys — Массив или Map с ключами, из которых создаётся отображение. Array или Map
  • values — Массив или Map со значениями, из которых создаётся отображение. Array или Map

Возвращаемое значение

Возвращает отображение с ключами и значениями, построенными на основе массива ключей и массива/Map значений. Map

Примеры

Базовое использование

SELECT mapFromArrays(['a', 'b', 'c'], [1, 2, 3])
{'a':1,'b':2,'c':3}

Для входных данных типа map

SELECT mapFromArrays([1, 2, 3], map('a', 1, 'b', 2, 'c', 3))
{1:('a', 1), 2:('b', 2), 3:('c', 3)}

mapKeys

Добавлено в версии: v21.2

Возвращает ключи указанного столбца типа Map. Эта функция может быть оптимизирована путём включения настройки optimize_functions_to_subcolumns. При включённой настройке функция читает только подстолбец keys вместо всего столбца Map. Запрос SELECT mapKeys(m) FROM table преобразуется в SELECT m.keys FROM table.

Синтаксис

mapKeys(map)

Аргументы

  • map — отображение, из которого извлекаются ключи. Map(K, V)

Возвращаемое значение

Возвращает массив, содержащий все ключи отображения. Array(T)

Примеры

Пример использования

SELECT mapKeys(map('k1', 'v1', 'k2', 'v2'))
['k1','k2']

mapPartialReverseSort

Добавлена в версии: v23.4

Сортирует элементы map по убыванию с дополнительным аргументом limit, который позволяет выполнять частичную сортировку. Если указана функция func, порядок сортировки определяется результатом применения функции func к ключам и значениям map.

Синтаксис

mapPartialReverseSort([func,] limit, map)

Аргументы

  • func — Необязательный параметр. Лямбда-функция. Лямбда-функция
  • limit — Сортируются элементы в диапазоне [1..limit]. (U)Int*
  • map — Отображение (map), которое требуется отсортировать. Map(K, V)

Возвращаемое значение

Возвращает частично отсортированное отображение (map) по убыванию. Map(K, V)

Примеры

Пример использования

SELECT mapPartialReverseSort((k, v) -> v, 2, map('k1', 3, 'k2', 1, 'k3', 2))
{'k1':3,'k3':2,'k2':1}

mapPartialSort

Введена в версии v23.4

Сортирует элементы map по возрастанию с дополнительным аргументом limit, который позволяет выполнять частичную сортировку. Если указана функция func, порядок сортировки определяется результатом применения функции func к ключам и значениям map.

Синтаксис

mapPartialSort([func,] limit, map)

Аргументы

  • func — Необязательный аргумент. Лямбда-функция. Lambda function
  • limit — Сортируются элементы в диапазоне [1..limit]. (U)Int*
  • map — Отображение (map) для сортировки. Map(K, V)

Возвращаемое значение

Возвращает частично отсортированное отображение. Map(K, V)

Примеры

Пример использования

SELECT mapPartialSort((k, v) -> v, 2, map('k1', 3, 'k2', 1, 'k3', 2))
{'k2':1,'k3':2,'k1':3}

mapPopulateSeries

Введена в: v20.10

Заполняет отсутствующие пары ключ-значение в map с целочисленными ключами. Чтобы можно было продолжить последовательность ключей за пределы наибольшего значения, можно указать максимальный ключ. Более точно, функция возвращает map, в котором ключи образуют последовательность от наименьшего до наибольшего ключа (или до аргумента max, если он указан) с шагом 1 и соответствующими значениями. Если для ключа не задано значение, используется значение по умолчанию. Если ключи повторяются, с ключом связывается только первое значение (в порядке появления).

Синтаксис

mapPopulateSeries(map[, max]) | mapPopulateSeries(keys, values[, max])

Аргументы

  • map — Map с целочисленными ключами. Map((U)Int*, V)
  • keys — Массив ключей. Array(T)
  • values — Массив значений. Array(T)
  • max — Необязательный параметр. Максимальное значение ключа. Int8 или Int16 или Int32 или Int64 или Int128 или Int256

Возвращаемое значение

Возвращает Map или кортеж из двух массивов, в котором первый содержит ключи в отсортированном порядке, а второй — значения для соответствующих ключей. Map(K, V) или Tuple(Array(UInt*), Array(Any))

Примеры

С типом Map

SELECT mapPopulateSeries(map(1, 10, 5, 20), 6)
{1:10, 2:0, 3:0, 4:0, 5:20, 6:0}

С сопоставленными массивами

SELECT mapPopulateSeries([1, 2, 4], [11, 22, 44], 5)
([1, 2, 3, 4, 5], [11, 22, 0, 44, 0])

mapReverseSort

Введена в версии: v23.4

Сортирует элементы map в порядке убывания. Если указана функция func, порядок сортировки определяется результатом применения функции func к ключам и значениям map.

Синтаксис

mapReverseSort([func,] map)

Аргументы

  • func — необязательная лямбда‑функция. Lambda function
  • map — отображение для сортировки. Map(K, V)

Возвращаемое значение

Возвращает отображение, отсортированное по убыванию. Map(K, V)

Примеры

Пример использования

SELECT mapReverseSort((k, v) -> v, map('k1', 3, 'k2', 1, 'k3', 2))
{'k1':3,'k3':2,'k2':1}

mapSort

Впервые добавлена в: v23.4

Сортирует элементы map по возрастанию. Если указана функция func, порядок сортировки определяется результатом применения функции func к ключам и значениям map.

Синтаксис

mapSort([func,] map)

Аргументы

  • func — Необязательная лямбда-функция. Lambda function
  • map — Map для сортировки. Map(K, V)

Возвращаемое значение

Возвращает Map, отсортированный по возрастанию. Map(K, V)

Примеры

Пример использования

SELECT mapSort((k, v) -> v, map('k1', 3, 'k2', 1, 'k3', 2))
{'k2':1,'k3':2,'k1':3}

mapSubtract

Появилась в версии v20.7

Собирает все ключи и вычитает соответствующие им значения.

Синтаксис

mapSubtract(arg1[, arg2, ...])

Аргументы

  • arg1[, arg2, ...] — значения типа Map или кортежи из двух массивов, в которых элементы первого массива являются ключами, а второй массив содержит значения, соответствующие каждому ключу. Map(K, V) или Tuple(Array(T), Array(T))

Возвращаемое значение

Возвращает одно значение типа Map или кортеж, где первый массив содержит отсортированные ключи, а второй массив — соответствующие им значения. Map(K, V) или Tuple(Array(T), Array(T))

Примеры

С типом Map

SELECT mapSubtract(map(1, 1), map(1, 1))
{1:0}

С отображением с кортежами в качестве ключей

SELECT mapSubtract(([toUInt8(1), 2], [toInt32(1), 1]), ([toUInt8(1), 2], [toInt32(2), 1]))
([1, 2], [-1, 0])

mapUpdate

Впервые появилась в: v22.3

Для двух map возвращает первую map, в которой значения заменены на значения из второй map для соответствующих ключей.

Синтаксис

mapUpdate(map1, map2)

Аргументы

  • map1 — Отображение, которое нужно обновить. Map(K, V)
  • map2 — Отображение, используемое для обновления. Map(K, V)

Возвращаемое значение

Возвращает map1, в котором значения для соответствующих ключей обновлены значениями из map2. Map(K, V)

Примеры

Базовое использование

SELECT mapUpdate(map('key1', 0, 'key3', 0), map('key1', 10, 'key2', 10))
{'key3':0,'key1':10,'key2':10}

mapValues

Введена в версии: v21.2

Возвращает значения заданной карты. Эту функцию можно оптимизировать, включив настройку optimize_functions_to_subcolumns. При включённой настройке функция читает только подстолбец values вместо всей карты. Запрос SELECT mapValues(m) FROM table преобразуется в SELECT m.values FROM table.

Синтаксис

mapValues(map)

Аргументы

  • map — отображение, из которого извлекаются значения. Map(K, V)

Возвращаемое значение

Возвращает массив, содержащий все значения из отображения. Array(T)

Примеры

Пример использования

SELECT mapValues(map('k1', 'v1', 'k2', 'v2'))
['v1','v2']