Функции для работы с кортежами
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)
Аргументы
Кортежи должны иметь одинаковый размер и тип элементов.
Возвращаемое значение
- Расстояние Хэмминга.
Тип: 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
.
Аргументы
Возвращаемое значение
- Кортеж с суммами.
Тип: Tuple.
Пример
Запрос:
SELECT tuplePlus((1, 2), (2, 3));
Результат:
┌─tuplePlus((1, 2), (2, 3))─┐
│ (3,5) │
└───────────────────────────┘
tupleMinus
Вычисляет разность соответствующих значений двух кортежей одинакового размера.
Синтаксис
tupleMinus(tuple1, tuple2)
Синоним: vectorDifference
.
Аргументы
Возвращаемое значение
- Кортеж с разностями.
Тип: Tuple.
Пример
Запрос:
SELECT tupleMinus((1, 2), (2, 3));
Результат:
┌─tupleMinus((1, 2), (2, 3))─┐
│ (-1,-1) │
└────────────────────────────┘
tupleMultiply
Вычисляет произведение соответствующих значений двух кортежей одинакового размера.
Синтаксис
tupleMultiply(tuple1, tuple2)
Аргументы
Возвращаемое значение
- Кортеж с произведениями.
Тип: Tuple.
Пример
Запрос:
SELECT tupleMultiply((1, 2), (2, 3));
Результат:
┌─tupleMultiply((1, 2), (2, 3))─┐
│ (2,6) │
└───────────────────────────────┘
tupleDivide
Вычисляет частное соответствующих значений двух кортежей одинакового размера. Обратите внимание, что при делении на ноль возвращается значение inf
.
Синтаксис
tupleDivide(tuple1, tuple2)
Аргументы
Возвращаемое значение
- Кортеж с частными.
Тип: 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
.
Аргументы
Возвращаемое значение
- Скалярное произведение.
Тип: Int/UInt, Float или Decimal.
Пример
Запрос:
SELECT dotProduct((1, 2), (2, 3));
Результат:
┌─dotProduct((1, 2), (2, 3))─┐
│ 8 │
└────────────────────────────┘
L1Norm
Вычисляет сумму абсолютных значений кортежа.
Синтаксис
L1Norm(tuple)
Синоним: normL1
.
Аргументы
tuple
— кортеж. Tuple.
Возвращаемое значение
- L1-норма или расстояние городских кварталов.
Пример
Запрос:
SELECT L1Norm((1, 2));
Результат:
┌─L1Norm((1, 2))─┐
│ 3 │
└────────────────┘
L2Norm
Вычисляет квадратный корень из суммы квадратов значений кортежа.
Синтаксис
L2Norm(tuple)
Синоним: normL2
.
Аргументы
tuple
— кортеж. Tuple.
Возвращаемое значение
- L2-норма или Евклидово расстояние.
Тип: 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
.
Аргументы
Возвращаемое значение
- Расстояние в норме L1.
Тип: Float.
Пример
Запрос:
SELECT L1Distance((1, 2), (2, 3));
Результат:
┌─L1Distance((1, 2), (2, 3))─┐
│ 2 │
└────────────────────────────┘
L2Distance
Вычисляет расстояние между двумя точками (значения кортежей — координаты точек) в пространстве L2
(Евклидово расстояние).
Синтаксис
L2Distance(tuple1, tuple2)
Синоним: distanceL2
.
Аргументы
Возвращаемое значение
- Расстояние в норме L2.
Тип: Float.
Пример
Запрос:
SELECT L2Distance((1, 2), (2, 3));
Результат:
┌─L2Distance((1, 2), (2, 3))─┐
│ 1.4142135623730951 │
└────────────────────────────┘
LinfDistance
Вычисляет расстояние между двумя точками (значения кортежей — координаты точек) в пространстве L_{inf}
.
Синтаксис
LinfDistance(tuple1, tuple2)
Синоним: distanceLinf
.
Аргументы
Возвращаемые значения
- Расстояние в норме 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
— Tuple.
Возвращаемое значение
- Единичный вектор.
Тип: кортеж 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)
Аргументы
Возвращаемые значения
- Разность между единицей и косинуса угла между векторами.
Тип: Float.
Пример
Запрос:
SELECT cosineDistance((1, 2), (2, 3));
Результат:
┌─cosineDistance((1, 2), (2, 3))─┐
│ 0.007722123286332261 │
└────────────────────────────────┘