HLL
HLL (HyperLogLog) — это тип данных в Doris для приближённого подсчёта уникальных значений. При больших объёмах данных HLL устраняет дубликаты значительно быстрее, чем Count Distinct, и часто используется для сбора статистики UV, подсчёта уникальных пользователей и подобных задач.
Исходные значения нельзя записывать непосредственно в столбец HLL, поэтому при загрузке данные необходимо хешировать с помощью таких функций, как hll_hash. Подробнее о типе HLL см. в разделе HLL.
Сценарии использования
| Сценарий | Описание |
|---|---|
| Статистика UV на огромных объёмах данных | Например, оценка числа уникальных активных пользователей за день и за месяц |
| Подсчёт уникальных значений на больших объёмах данных | Объёмы свыше миллиона записей, при которых допустима небольшая погрешность |
| Замена Count Distinct | Значительное снижение вычислительных затрат при сохранении погрешности в допустимых пределах |
Обзор процесса
Полный процесс загрузки данных HLL состоит из следующих 4 шагов:
- Подготовьте исходный файл данных для загрузки.
- Создайте в Doris целевую таблицу со столбцом HLL.
- Загрузите данные с помощью Stream Load и функции
hll_hash. - Проверьте результат загрузки с помощью
hll_cardinality.
Пример
Шаг 1: Подготовьте данные
Создайте исходный файл данных test_hll.csv со следующим содержимым:
1001|koga
1002|nijg
1003|lojn
1004|lofn
1005|jfin
1006|kon
1007|nhga
1008|nfubg
1009|huang
1010|buag
Шаг 2: Создайте таблицу в базе данных
В целевой базе данных создайте таблицу с моделью Aggregate и столбцом HLL:
CREATE TABLE testdb.test_hll(
typ_id BIGINT NULL COMMENT "ID",
typ_name VARCHAR(10) NULL COMMENT "NAME",
pv hll hll_union NOT NULL COMMENT "hll"
)
AGGREGATE KEY(typ_id,typ_name)
DISTRIBUTED BY HASH(typ_id) BUCKETS 10;
Примечания:
- Для столбца HLL необходимо указать агрегатную функцию
hll_union. - Таблица должна использовать модель
AGGREGATE KEY.
Шаг 3: Загрузите данные
Загрузите данные с помощью Stream Load. Используйте параметр columns, чтобы применить функцию hll_hash к исходному столбцу typ_id и записать результат в столбец pv:
curl --location-trusted -u <doris_user>:<doris_password> \
-H "column_separator:|" \
-H "columns:typ_id,typ_name,pv=hll_hash(typ_id)" \
-T test_hll.csv \
-XPUT http://<fe_ip>:<fe_http_port>/api/testdb/test_hll/_stream_load
Описание основных параметров:
| Параметр | Описание |
|---|---|
column_separator | Разделитель столбцов в исходном файле. В этом примере используется ` |
columns | Выражение сопоставления полей. Значения для столбца HLL необходимо преобразовать с помощью hll_hash(). |
<doris_user> / <doris_password> | Имя пользователя и пароль для Doris. |
<fe_ip> / <fe_http_port> | IP-адрес и HTTP-порт узла FE. |
Шаг 4: Проверьте загруженные данные
Выполните запрос с функцией hll_cardinality, чтобы получить результат подсчёта уникальных значений в столбце HLL:
mysql> select typ_id,typ_name,hll_cardinality(pv) from testdb.test_hll;
+--------+----------+---------------------+
| typ_id | typ_name | hll_cardinality(pv) |
+--------+----------+---------------------+
| 1010 | buag | 1 |
| 1002 | nijg | 1 |
| 1001 | koga | 1 |
| 1008 | nfubg | 1 |
| 1005 | jfin | 1 |
| 1009 | huang | 1 |
| 1004 | lofn | 1 |
| 1007 | nhga | 1 |
| 1003 | lojn | 1 |
| 1006 | kon | 1 |
+--------+----------+---------------------+
10 rows in set (0.06 sec)
Результат показывает, что число уникальных значений в столбце HLL равно 1 для каждой строки. Это означает, что данные загружены корректно и хешированы с помощью hll_hash.
Часто задаваемые вопросы
Почему для столбцов HLL необходимо использовать hll_hash?
HLL — это специальный бинарный агрегатный тип, который не может хранить исходные значения напрямую. Перед записью в столбец HLL исходное значение необходимо преобразовать во внутреннее представление HLL с помощью hll_hash.
Чем HLL отличается от Count Distinct?
| Критерий | HLL | Count Distinct |
|---|---|---|
| Точность | Приближённый результат с небольшой погрешностью | Точный результат |
| Производительность | Значительно выше при больших объёмах данных | Заметно снижается при больших объёмах данных |
| Хранение | Фиксированный и относительно небольшой объём | Дополнительное место для хранения не требуется |
| Сценарии использования | Оценка UV и другие сценарии, в которых допустима некоторая погрешность | Сценарии, требующие точного подсчёта уникальных значений |
Какая модель таблицы требуется для создания столбца HLL?
Столбец HLL использует агрегатную функцию hll_union, поэтому он должен находиться в таблице с агрегатной моделью AGGREGATE KEY.