Co-authored-by: olgarev <56617294+olgarev@users.noreply.github.com>
31 KiB
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)
Аргументы
Кортежи должны иметь одинаковый размер и тип элементов.
Возвращаемое значение
- Расстояние Хэмминга.
Тип: 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}
Вычисляет сумму соответствующих значений двух кортежей одинакового размера.
**Синтаксис**
```sql
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 │
└────────────────────────────────┘