Функция uniqExact

369 views
Skip to first unread message

Юрий Думп

unread,
Mar 22, 2017, 11:15:39 AM3/22/17
to ClickHouse
Здравствуйте. Есть система которая собирает статистику действий по пользователям, данные хранятся в таблице SummingMergeTree, в которой идентификатор пользователя входит в первичный ключ. Данные в таблицу только добавляются. Для построения отчетов по количеству уникальных пользователей мы используем функцию uniq, но для определенных задач точность ее работы нас перестала устраивать. Мы решили воспользоваться функцией uniqExact, но при построении выборок с ней, столкнулись с тем что при добавлении новых данных результат работы функции может быть меньше результата аналогичного запроса, который выполнялся 5 минут назад (повторюсь данные только добавляются). Более того результат uniqExact полностью совпадает с результатом uniq. Вопрос такой обладает ли функция uniqExact погрешностью? Может есть (или были) какие-либо проблемы с данной функцией? Как можно гарантировано точно посчитать количество уникальных значений? 
Если полезно для ответа, то количество уникальных значений идентификаторов  порядка 2-х млн. 

man...@gmail.com

unread,
Mar 26, 2017, 11:54:13 PM3/26/17
to ClickHouse
Здравствуйте.

Функция uniqExact не обладает погрешностью (расчёт всегда точный, независимо от количества значений).
Проблем с этой функцией пока ещё не было замечено.
Проверить корректность работы можно, сравнив значения:

SELECT uniqExact(x) FROM table
и
SELECT count() FROM (SELECT DISTINCT x FROM table)

Результаты будут совпадать.

После вставки в SummingMergeTree, количество строк может уменьшаться при слиянии, если для некоторых первичных ключей, все суммируемые поля просуммировались в ноль. То есть, если вы вставляете в таблицу отрицательные значения полей, либо изначально нулевые значения.

Также результат работы запроса может меняться, если при распределённой обработке запроса, используются разные реплики, и эти реплики в данный момент времени содержат разные данные (то есть, некоторые реплики отстают).

Если всё-равно что-то не так, надо разбираться дальше. Попробуйте изолировать случай, в котором расчёт выглядит неправильно...
Reply all
Reply to author
Forward
0 new messages