ClickHouse/docs/ru/sql-reference/functions/tuple-functions.md
2022-01-18 20:38:30 +01:00

31 KiB
Raw Blame History

toc_priority toc_title
68 Функции для работы с кортежами

Функции для работы с кортежами

tuple

Функция, позволяющая сгруппировать несколько столбцов. Для столбцов, имеющих типы T1, T2, … возвращает кортеж типа Tuple(T1, T2, …), содержащий эти столбцы. Выполнение функции ничего не стоит. Кортежи обычно используются как промежуточное значение в качестве аргумента операторов IN, или для создания списка формальных параметров лямбда-функций. Кортежи не могут быть записаны в таблицу.

С помощью функции реализуется оператор (x, y, …).

Синтаксис

tuple(x, y, )

tupleElement

Функция, позволяющая достать столбец из кортежа. N - индекс столбца начиная с 1. N должно быть константой. N должно быть целым строго положительным числом не большим размера кортежа. Выполнение функции ничего не стоит.

С помощью функции реализуется оператор x.N.

Синтаксис

tupleElement(tuple, n)

untuple

Выполняет синтаксическую подстановку элементов кортежа в место вызова.

Синтаксис

untuple(x)

Чтобы пропустить некоторые столбцы в результате запроса, вы можете использовать выражение EXCEPT.

Аргументы

  • x — функция tuple, столбец или кортеж элементов. Tuple.

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

  • Нет.

Примеры

Входная таблица:

┌─key─┬─v1─┬─v2─┬─v3─┬─v4─┬─v5─┬─v6────────┐
│   1 │ 10 │ 20 │ 40 │ 30 │ 15 │ (33,'ab') │
│   2 │ 25 │ 65 │ 70 │ 40 │  6 │ (44,'cd') │
│   3 │ 57 │ 30 │ 20 │ 10 │  5 │ (55,'ef') │
│   4 │ 55 │ 12 │  7 │ 80 │ 90 │ (66,'gh') │
│   5 │ 30 │ 50 │ 70 │ 25 │ 55 │ (77,'kl') │
└─────┴────┴────┴────┴────┴────┴───────────┘

Пример использования столбца типа Tuple в качестве параметра функции untuple:

Запрос:

SELECT untuple(v6) FROM kv;

Результат:

┌─_ut_1─┬─_ut_2─┐
│    33 │ ab    │
│    44 │ cd    │
│    55 │ ef    │
│    66 │ gh    │
│    77 │ kl    │
└───────┴───────┘

Пример использования выражения EXCEPT:

Запрос:

SELECT untuple((* EXCEPT (v2, v3),)) FROM kv;

Результат:

┌─key─┬─v1─┬─v4─┬─v5─┬─v6────────┐
│   1 │ 10 │ 30 │ 15 │ (33,'ab') │
│   2 │ 25 │ 40 │  6 │ (44,'cd') │
│   3 │ 57 │ 10 │  5 │ (55,'ef') │
│   4 │ 55 │ 80 │ 90 │ (66,'gh') │
│   5 │ 30 │ 25 │ 55 │ (77,'kl') │
└─────┴────┴────┴────┴───────────┘

Смотрите также

tupleHammingDistance

Возвращает расстояние Хэмминга между двумя кортежами одинакового размера.

Синтаксис

tupleHammingDistance(tuple1, tuple2)

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

Кортежи должны иметь одинаковый размер и тип элементов.

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

  • Расстояние Хэмминга.

Тип: UInt8.

Примеры

Запрос:

SELECT tupleHammingDistance((1, 2, 3), (3, 2, 1)) AS HammingDistance;

Результат:

┌─HammingDistance─┐
│               2 │
└─────────────────┘

Может быть использовано с функциями MinHash для проверки строк на совпадение:

SELECT tupleHammingDistance(wordShingleMinHash(string), wordShingleMinHashCaseInsensitive(string)) as HammingDistance FROM (SELECT 'Clickhouse is a column-oriented database management system for online analytical processing of queries.' AS string);

Результат:

┌─HammingDistance─┐
│               2 │
└─────────────────┘

tupleToNameValuePairs

Приводит именованный кортеж к списку пар (имя, значение). Для Tuple(a T, b T, ..., c T) возвращает Array(Tuple(String, T), ...), где Strings — это названия именованных полей, а T — это соответствующие значения. Все значения в кортеже должны быть одинакового типа.

Синтаксис

tupleToNameValuePairs(tuple)

Аргументы

  • tuple — именованный кортеж. Tuple с любым типом значений.

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

  • Список пар (имя, значение).

Тип: Array(Tuple(String, ...)).

Пример

Запрос:

CREATE TABLE tupletest (`col` Tuple(user_ID UInt64, session_ID UInt64) ENGINE = Memory;

INSERT INTO tupletest VALUES (tuple( 100, 2502)), (tuple(1,100));

SELECT tupleToNameValuePairs(col) FROM tupletest;

Результат:

┌─tupleToNameValuePairs(col)────────────┐
│ [('user_ID',100),('session_ID',2502)] │
│ [('user_ID',1),('session_ID',100)]    │
└───────────────────────────────────────┘

С помощью этой функции можно выводить столбцы в виде строк:

CREATE TABLE tupletest (`col` Tuple(CPU Float64, Memory Float64, Disk Float64)) ENGINE = Memory;

INSERT INTO tupletest VALUES(tuple(3.3, 5.5, 6.6));

SELECT arrayJoin(tupleToNameValuePairs(col))FROM tupletest;

Результат:

┌─arrayJoin(tupleToNameValuePairs(col))─┐
│ ('CPU',3.3)                           │
│ ('Memory',5.5)                        │
│ ('Disk',6.6)                          │
└───────────────────────────────────────┘

Если в функцию передается обычный кортеж, ClickHouse использует индексы значений в качестве имен:

SELECT tupleToNameValuePairs(tuple(3, 2, 1));

Результат:

┌─tupleToNameValuePairs(tuple(3, 2, 1))─┐
│ [('1',3),('2',2),('3',1)]             │
└───────────────────────────────────────┘

tuplePlus

Вычисляет сумму соответствующих значений двух кортежей одинакового размера.

Синтаксис

tuplePlus(tuple1, tuple2)

Синоним: vectorSum.

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

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

  • Кортеж с суммами.

Тип: Tuple.

Пример

Запрос:

SELECT tuplePlus((1, 2), (2, 3));

Результат:

┌─tuplePlus((1, 2), (2, 3))─┐
│ (3,5)                     │
└───────────────────────────┘

tupleMinus

Вычисляет разность соответствующих значений двух кортежей одинакового размера.

Синтаксис

tupleMinus(tuple1, tuple2)

Синоним: vectorDifference.

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

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

  • Кортеж с разностями.

Тип: Tuple.

Пример

Запрос:

SELECT tupleMinus((1, 2), (2, 3));

Результат:

┌─tupleMinus((1, 2), (2, 3))─┐
│ (-1,-1)                    │
└────────────────────────────┘

tupleMultiply

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

Синтаксис

tupleMultiply(tuple1, tuple2)

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

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

  • Кортеж с произведениями.

Тип: Tuple.

Пример

Запрос:

SELECT tupleMultiply((1, 2), (2, 3));

Результат:

┌─tupleMultiply((1, 2), (2, 3))─┐
│ (2,6)                         │
└───────────────────────────────┘

tupleDivide

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

Синтаксис

tupleDivide(tuple1, tuple2)

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

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

  • Кортеж с частными.

Тип: Tuple.

Пример

Запрос:

SELECT tupleDivide((1, 2), (2, 3));

Результат:

┌─tupleDivide((1, 2), (2, 3))─┐
│ (0.5,0.6666666666666666)    │
└─────────────────────────────┘

tupleNegate

Применяет отрицание ко всем значениям кортежа.

Синтаксис

tupleNegate(tuple)

Аргументы

  • tuple — кортеж. Tuple.

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

  • Кортеж с результатом отрицания.

Тип: Tuple.

Пример

Запрос:

SELECT tupleNegate((1, 2));

Результат:

┌─tupleNegate((1, 2))─┐
│ (-1,-2)             │
└─────────────────────┘

tupleMultiplyByNumber

Возвращает кортеж, в котором значения всех элементов умножены на заданное число.

Синтаксис

tupleMultiplyByNumber(tuple, number)

Аргументы

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

  • Кортеж с результатами умножения на число.

Тип: Tuple.

Пример

Запрос:

SELECT tupleMultiplyByNumber((1, 2), -2.1);

Результат:

┌─tupleMultiplyByNumber((1, 2), -2.1)─┐
│ (-2.1,-4.2)                         │
└─────────────────────────────────────┘

tupleDivideByNumber

Возвращает кортеж, в котором значения всех элементов поделены на заданное число. Обратите внимание, что при делении на ноль возвращается значение inf.

Синтаксис

tupleDivideByNumber(tuple, number)

Аргументы

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

  • Кортеж с результатами деления на число.

Тип: Tuple.

Пример

Запрос:

SELECT tupleDivideByNumber((1, 2), 0.5);

Результат:

┌─tupleDivideByNumber((1, 2), 0.5)─┐
│ (2,4)                            │
└──────────────────────────────────┘

dotProduct

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

Синтаксис

dotProduct(tuple1, tuple2)

Синоним: scalarProduct.

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

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

  • Скалярное произведение.

Тип: Int/UInt, Float или Decimal.

Пример

Запрос:

SELECT dotProduct((1, 2), (2, 3));

Результат:

┌─dotProduct((1, 2), (2, 3))─┐
│                          8 │
└────────────────────────────┘

L1Norm

Вычисляет сумму абсолютных значений кортежа.

Синтаксис

L1Norm(tuple)

Синоним: normL1.

Аргументы

  • tuple — кортеж. Tuple.

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

Тип: UInt, Float или Decimal.

Пример

Запрос:

SELECT L1Norm((1, 2));

Результат:

┌─L1Norm((1, 2))─┐
│              3 │
└────────────────┘

L2Norm

Вычисляет квадратный корень из суммы квадратов значений кортежа.

Синтаксис

L2Norm(tuple)

Синоним: normL2.

Аргументы

  • tuple — кортеж. Tuple.

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

Тип: Float.

Пример

Запрос:

SELECT L2Norm((1, 2));

Результат:

┌───L2Norm((1, 2))─┐
│ 2.23606797749979 │
└──────────────────┘

LinfNorm

Вычисляет максимум из абсолютных значений кортежа.

Синтаксис

LinfNorm(tuple)

Синоним: normLinf.

Аргументы

  • tuple — кортеж. Tuple.

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

  • Linf-норма или максимальное абсолютное значение.

Тип: Float.

Пример

Запрос:

SELECT LinfNorm((1, -2));

Результат:

┌─LinfNorm((1, -2))─┐
│                 2 │
└───────────────────┘

LpNorm

Возвращает корень степени p из суммы абсолютных значений кортежа, возведенных в степень p.

Синтаксис

LpNorm(tuple, p)

Синоним: normLp.

Аргументы

  • tuple — кортеж. Tuple.
  • p — степень. Возможные значение: любое число из промежутка [1;inf). UInt или Float.

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

Тип: Float.

Пример

Запрос:

SELECT LpNorm((1, -2),2);

Результат:

┌─LpNorm((1, -2), 2)─┐
│   2.23606797749979 │
└────────────────────┘

L1Distance

Вычисляет расстояние между двумя точками (значения кортежей — координаты точек) в пространстве L1 (расстояние городских кварталов).

Синтаксис

L1Distance(tuple1, tuple2)

Синоним: distanceL1.

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

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

  • Расстояние в норме L1.

Тип: Float.

Пример

Запрос:

SELECT L1Distance((1, 2), (2, 3));

Результат:

┌─L1Distance((1, 2), (2, 3))─┐
│                          2 │
└────────────────────────────┘

L2Distance

Вычисляет расстояние между двумя точками (значения кортежей — координаты точек) в пространстве L2 (Евклидово расстояние).

Синтаксис

L2Distance(tuple1, tuple2)

Синоним: distanceL2.

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

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

  • Расстояние в норме L2.

Тип: Float.

Пример

Запрос:

SELECT L2Distance((1, 2), (2, 3));

Результат:

┌─L2Distance((1, 2), (2, 3))─┐
│         1.4142135623730951 │
└────────────────────────────┘

LinfDistance

Вычисляет расстояние между двумя точками (значения кортежей — координаты точек) в пространстве L_{inf}.

Синтаксис

LinfDistance(tuple1, tuple2)

Синоним: distanceLinf.

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

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

  • Расстояние в норме Linf.

Тип: Float.

Пример

Запрос:

SELECT LinfDistance((1, 2), (2, 3));

Результат:

┌─LinfDistance((1, 2), (2, 3))─┐
│                            1 │
└──────────────────────────────┘

LpDistance

Вычисляет расстояние между двумя точками (значения кортежей — координаты точек) в пространстве Lp.

Синтаксис

LpDistance(tuple1, tuple2, p)

Синоним: distanceLp.

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.
  • p — степень. Возможные значение: любое число из промежутка [1;inf). UInt или Float.

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

  • Расстояние в норме Lp.

Тип: Float.

Пример

Запрос:

SELECT LpDistance((1, 2), (2, 3), 3);

Результат:

┌─LpDistance((1, 2), (2, 3), 3)─┐
│            1.2599210498948732 │
└───────────────────────────────┘

L1Normalize

Вычисляет единичный вектор для исходного вектора (значения кортежа — координаты вектора) в пространстве L1 (расстояние городских кварталов).

Синтаксис

L1Normalize(tuple)

Синоним: normalizeL1.

Аргументы

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

  • Единичный вектор.

Тип: кортеж Tuple значений Float.

Пример

Запрос:

SELECT L1Normalize((1, 2));

Результат:

┌─L1Normalize((1, 2))─────────────────────┐
│ (0.3333333333333333,0.6666666666666666) │
└─────────────────────────────────────────┘

L2Normalize

Вычисляет единичный вектор для исходного вектора (значения кортежа — координаты вектора) в пространстве L2 (Евклидово пространство.

Синтаксис

L2Normalize(tuple)

Синоним: normalizeL1.

Аргументы

  • tuple — кортеж. Tuple.

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

  • Единичный вектор.

Тип: кортеж Tuple значений Float.

Пример

Запрос:

SELECT L2Normalize((3, 4));

Результат:

┌─L2Normalize((3, 4))─┐
│ (0.6,0.8)           │
└─────────────────────┘

LinfNormalize

Вычисляет единичный вектор для исходного вектора (значения кортежа — координаты вектора) в пространстве L_{inf}.

Синтаксис

LinfNormalize(tuple)

Синоним: normalizeLinf .

Аргументы

  • tuple — кортеж. Tuple.

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

  • Единичный вектор.

Тип: кортеж Tuple значений Float.

Пример

Запрос:

SELECT LinfNormalize((3, 4));

Результат:

┌─LinfNormalize((3, 4))─┐
│ (0.75,1)              │
└───────────────────────┘

LpNormalize

Вычисляет единичный вектор для исходного вектора (значения кортежа — координаты вектора) в пространстве Lp.

Синтаксис

LpNormalize(tuple, p)

Синоним: normalizeLp .

Аргументы

  • tuple — кортеж. Tuple.
  • p — степень. Возможные значение: любое число из промежутка [1;inf). UInt или Float.

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

  • Единичный вектор.

Тип: кортеж Tuple значений Float.

Пример

Запрос:

SELECT LpNormalize((3, 4),5);

Результат:

┌─LpNormalize((3, 4), 5)──────────────────┐
│ (0.7187302630182624,0.9583070173576831) │
└─────────────────────────────────────────┘

cosineDistance

Вычисляет косинусную разницу двух векторов (значения кортежей — координаты векторов). Чем меньше возвращаемое значение, тем больше сходство между векторами.

Синтаксис

cosineDistance(tuple1, tuple2)

Аргументы

  • tuple1 — первый кортеж. Tuple.
  • tuple2 — второй кортеж. Tuple.

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

  • Разность между единицей и косинуса угла между векторами.

Тип: Float.

Пример

Запрос:

SELECT cosineDistance((1, 2), (2, 3));

Результат:

┌─cosineDistance((1, 2), (2, 3))─┐
│           0.007722123286332261 │
└────────────────────────────────┘