uniqCombined
Вычисляет приблизительное количество различных значений аргументов.
Функция uniqCombined — хороший выбор для вычисления количества различных значений.
Аргументы
HLL_precision: двоичный логарифм числа ячеек в HyperLogLog. Необязательный параметр, функцию можно вызывать какuniqCombined(x[, ...]). Значение по умолчанию дляHLL_precision— 17, что фактически соответствует 96 КиБ памяти (2^17 ячеек, по 6 бит каждая).X: произвольное количество параметров. Параметры могут иметь типыTuple,Array,Date,DateTime,Stringили числовые типы.
Возвращаемое значение
- Число типа UInt64.
Подробности реализации
Функция uniqCombined:
- Вычисляет хеш (64-битный хеш для
Stringи 32-битный в остальных случаях) для всех параметров при агрегации и затем использует его в вычислениях. - Использует комбинацию из трёх алгоритмов: массива, хеш-таблицы и HyperLogLog с таблицей коррекции ошибки.
- Для небольшого количества различных элементов используется массив.
- Когда размер множества становится больше, используется хеш-таблица.
- Для ещё большего количества элементов используется HyperLogLog, который занимает фиксированный объём памяти.
- Возвращает детерминированный результат (он не зависит от порядка обработки запроса).
Поскольку для типов, отличных от String, используется 32-битный хеш, результат будет иметь очень большую погрешность для мощностей, значительно превышающих UINT_MAX (ошибка будет быстро расти после нескольких десятков миллиардов различных значений); поэтому в таком случае следует использовать uniqCombined64.
По сравнению с функцией uniq, функция uniqCombined:
- Потребляет в несколько раз меньше памяти.
- Обеспечивает точность, в несколько раз превосходящую
uniq. - Обычно имеет немного более низкую производительность. В некоторых сценариях
uniqCombinedможет работать быстрее, чемuniq, например, при распределённых запросах, которые передают по сети большое количество состояний агрегации.
Пример
Запрос:
Результат:
См. раздел с примером в uniqCombined64 для иллюстрации различий между uniqCombined и uniqCombined64 при работе с гораздо большими объёмами входных данных.
См. также