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

HLL

HLL (HyperLogLog) — это тип данных в Doris для приближённого подсчёта уникальных значений. При больших объёмах данных HLL устраняет дубликаты значительно быстрее, чем Count Distinct, и часто используется для сбора статистики UV, подсчёта уникальных пользователей и подобных задач.

Исходные значения нельзя записывать непосредственно в столбец HLL, поэтому при загрузке данные необходимо хешировать с помощью таких функций, как hll_hash. Подробнее о типе HLL см. в разделе HLL.

Сценарии использования​

СценарийОписание
Статистика UV на огромных объёмах данныхНапример, оценка числа уникальных активных пользователей за день и за месяц
Подсчёт уникальных значений на больших объёмах данныхОбъёмы свыше миллиона записей, при которых допустима небольшая погрешность
Замена Count DistinctЗначительное снижение вычислительных затрат при сохранении погрешности в допустимых пределах

Обзор процесса​

Полный процесс загрузки данных HLL состоит из следующих 4 шагов:

  1. Подготовьте исходный файл данных для загрузки.
  2. Создайте в Doris целевую таблицу со столбцом HLL.
  3. Загрузите данные с помощью Stream Load и функции hll_hash.
  4. Проверьте результат загрузки с помощью 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?​

КритерийHLLCount Distinct
ТочностьПриближённый результат с небольшой погрешностьюТочный результат
ПроизводительностьЗначительно выше при больших объёмах данныхЗаметно снижается при больших объёмах данных
ХранениеФиксированный и относительно небольшой объёмДополнительное место для хранения не требуется
Сценарии использованияОценка UV и другие сценарии, в которых допустима некоторая погрешностьСценарии, требующие точного подсчёта уникальных значений

Какая модель таблицы требуется для создания столбца HLL?​

Столбец HLL использует агрегатную функцию hll_union, поэтому он должен находиться в таблице с агрегатной моделью AGGREGATE KEY.