hll

hyperloglog 数据类型

概览

扩展包名版本分类许可证语言
hll2.19FEATApache-2.0C++
ID扩展名BinLibLoadCreateTrustReloc模式
2710hll-
相关扩展topn count_distinct omnisketch bloom roaringbitmap ddsketch tdigest citus

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG2.191817161514hll-
RPMPGDG2.191817161514hll_$v-
DEBPGDG2.191817161514postgresql-$v-hll-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 2.19
PGDG 2.19
PGDG 2.19
PGDG 2.19
PGDG 2.19
d12.aarch64
PGDG 2.19
PGDG 2.19
PGDG 2.19
PGDG 2.19
PGDG 2.19
d13.x86_64
PGDG 2.19
PGDG 2.19
PGDG 2.19
PGDG 2.19
PGDG 2.19
d13.aarch64
PGDG 2.19
PGDG 2.19
PGDG 2.19
PGDG 2.19
PGDG 2.19
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64

安装

您可以直接安装 hll 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install hll;          # 当前活跃 PG 版本安装
pig ext install -y hll -v 18  # PG 18
pig ext install -y hll -v 17  # PG 17
pig ext install -y hll -v 16  # PG 16
pig ext install -y hll -v 15  # PG 15
pig ext install -y hll -v 14  # PG 14
dnf install -y hll_18       # PG 18
dnf install -y hll_17       # PG 17
dnf install -y hll_16       # PG 16
dnf install -y hll_15       # PG 15
dnf install -y hll_14       # PG 14
apt install -y postgresql-18-hll   # PG 18
apt install -y postgresql-17-hll   # PG 17
apt install -y postgresql-16-hll   # PG 16
apt install -y postgresql-15-hll   # PG 15
apt install -y postgresql-14-hll   # PG 14

创建扩展

CREATE EXTENSION hll;

用法

hll: 用于存储 HyperLogLog 数据的类型

hll 扩展提供了 HyperLogLog 数据类型,用于概率性的去重计数。它能够高效地近似 COUNT(DISTINCT) 操作,支持可配置的精度,并支持集合合并操作,使预聚合数据可以无损合并。

数据类型

  • hll – HyperLogLog 累加器,参数:hll(log2m, regwidth, expthresh, sparseon)
  • hll_hashval – 用于插入 HLL 结构的哈希值类型

核心函数

函数描述
hll_empty()创建空的 HLL
hll_add(hll, hll_hashval)向 HLL 添加一个哈希值
hll_cardinality(hll)估算去重计数
hll_union(hll, hll)合并两个 HLL
hll_add_agg(hll_hashval)将哈希值聚合为单个 HLL
hll_union_agg(hll)将多个 HLL 合并为一个
hll_print(hll)显示 HLL 参数和内容

哈希函数

函数输入类型
hll_hash_boolean(boolean [, seed])boolean
hll_hash_smallint(smallint [, seed])smallint
hll_hash_integer(integer [, seed])integer
hll_hash_bigint(bigint [, seed])bigint
hll_hash_bytea(bytea [, seed])bytea
hll_hash_text(text [, seed])text
hll_hash_any(any [, seed])any(动态分发,较慢)

运算符

运算符功能示例
||hll_add / hll_unionusers || hll_hash_integer(123)
#hll_cardinality#users

示例:每日唯一用户跟踪

-- 存储每日唯一用户计数
CREATE TABLE daily_uniques (
    date  date UNIQUE,
    users hll
);

-- 聚合每日数据
INSERT INTO daily_uniques(date, users)
    SELECT date, hll_add_agg(hll_hash_integer(user_id))
    FROM facts GROUP BY 1;

-- 每周独立用户数(合并操作无损)
SELECT hll_cardinality(hll_union_agg(users))
FROM daily_uniques
WHERE date >= '2012-01-02' AND date <= '2012-01-08';

-- 按月统计
SELECT EXTRACT(MONTH FROM date) AS month,
       #hll_union_agg(users) AS approx_uniques
FROM daily_uniques
WHERE date >= '2012-01-01' AND date < '2013-01-01'
GROUP BY 1;

-- 7 天滑动窗口
SELECT date, #hll_union_agg(users) OVER seven_days
FROM daily_uniques
WINDOW seven_days AS (ORDER BY date ASC ROWS 6 PRECEDING);

配置参数

  • log2m(4–31):寄存器数量的以 2 为底的对数。控制精度,相对误差为 +/-1.04/sqrt(2^log2m)。默认值:11。
  • regwidth(1–8):每个寄存器的位数。与 log2m 配合调整最大基数估算。默认值:5。
  • expthresh(-1 到 18):控制 EXPLICIT 到 SPARSE 的转换。-1 为自动模式,0 跳过 EXPLICIT。默认值:-1。
  • sparseon(0 或 1):启用/禁用 SPARSE 表示。默认值:1。

同一 HLL 的所有输入必须使用相同的哈希种子。需要进行合并操作的 HLL 必须使用相同种子的哈希值填充。


最后修改 2026-03-14: update extension metadata (953cbd0)