Функции HyperLogLog#
CedrusData поддерживает функцию approx_distinct() на основе структуры данных HyperLogLog.
Структуры данных#
CedrusData реализует скетчи данных HyperLogLog как набор 32-битных корзин, хранящих максимальный хэш. Они могут храниться в разреженном (sparse) формате (как отображение идентификатора корзины на корзину) или в плотном (dense) формате (как непрерывный блок памяти). Структура данных HyperLogLog начинается с разреженного представления и переключается на плотное, когда это более эффективно. Структура P4HyperLogLog инициализируется в плотном формате и остается плотной на протяжении всего жизненного цикла.
HyperLogLog неявно приводится к P4HyperLogLog, при этом можно явно привести HyperLogLog к P4HyperLogLog:
cast(hll AS P4HyperLogLog)
Сериализация#
Скетчи данных могут быть сериализованы в varbinary и десериализованы из него.
Это позволяет сохранять их для дальнейшего использования.
В сочетании с возможностью объединения нескольких скетчей это позволяет вычислять approx_distinct() для элементов партиции запроса,
а затем для всего запроса с минимальными затратами.
Например, вычисление HyperLogLog для ежедневных уникальных пользователей позволит рассчитывать еженедельных или ежемесячных уникальных пользователей инкрементально,
объединяя ежедневные данные. Это аналогично вычислению еженедельной выручки путем суммирования ежедневной выручки. Использование approx_distinct() с
GROUPING SETS можно преобразовать в использование HyperLogLog. Примеры:
CREATE TABLE visit_summaries (
visit_date date,
hll varbinary
);
INSERT INTO visit_summaries
SELECT visit_date, cast(approx_set(user_id) AS varbinary)
FROM user_visits
GROUP BY visit_date;
SELECT cardinality(merge(cast(hll AS HyperLogLog))) AS weekly_unique_users
FROM visit_summaries
WHERE visit_date >= current_date - interval '7' day;
Функции#
- approx_set(x) HyperLogLog#
Возвращает скетч
HyperLogLogдля входного набора данныхx. Данный скетч лежит в основеapprox_distinct()и может быть сохранен и использован позже путем вызоваcardinality().
- cardinality(hll) bigint
Выполняет
approx_distinct()над данными, обобщенными скетчемhllHyperLogLog.
- empty_approx_set() HyperLogLog#
Возвращает пустой
HyperLogLog.
- merge(HyperLogLog) HyperLogLog#
Возвращает
HyperLogLog, являющийся агрегатным объединением отдельных структурhllHyperLogLog.