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

uniqCombined64

Вычисляет приблизительное количество различных значений аргументов. Это то же самое, что и uniqCombined, но использует 64-битный хеш для всех типов данных, а не только для типа String.

uniqCombined64(HLL_precision)(x[, ...])

Параметры

  • HLL_precision: Бинарный логарифм количества ячеек в HyperLogLog. При желании вы можете использовать функцию как uniqCombined64(x[, ...]). Значение по умолчанию для HLL_precision равно 17, что эквивалентно 96 Киб (2^17 ячеек по 6 бит каждая).
  • X: Переменное количество параметров. Параметры могут быть Tuple, Array, Date, DateTime, String или числовыми типами.

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

Детали реализации

Функция uniqCombined64:

  • Вычисляет хеш (64-битный хеш для всех типов данных) для всех параметров в агрегации, а затем использует его в расчетах.
  • Использует комбинацию трех алгоритмов: массив, хеш-таблица и HyperLogLog с таблицей коррекции ошибок.
    • Для небольшого количества различных элементов используется массив.
    • Когда размер множества больше, используется хеш-таблица.
    • Для большего количества элементов используется HyperLogLog, который занимает фиксированное количество памяти.
  • Обеспечивает детерминированный результат (он не зависит от порядка обработки запроса).
примечание

Поскольку используется 64-битный хеш для всех типов, результат не страдает от очень высокой ошибки для кардинальностей, значительно превышающих UINT_MAX, как это делает uniqCombined, который использует 32-битный хеш для не-String типов.

По сравнению с функцией uniq, функция uniqCombined64:

  • Потребляет в несколько раз меньше памяти.
  • Вычисляет с в несколько раз большей точностью.

Пример

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

Запрос:

SELECT uniqCombined64(number) FROM numbers(1e10);

Результат:

┌─uniqCombined64(number)─┐
│             9998568925 │ -- 10.00 billion
└────────────────────────┘

Для сравнения функция uniqCombined возвращает довольно плохое приближение для такого размера входных данных.

Запрос:

SELECT uniqCombined(number) FROM numbers(1e10);

Результат:

┌─uniqCombined(number)─┐
│           5545308725 │ -- 5.55 billion
└──────────────────────┘

См. также