HLL函数和操作符
哈希函数
- hll_hash_boolean(bool, int32)
描述:设置hash seed(即改变哈希策略)并对bool类型数据计算哈希值。
返回值类型:hll_hashval
示例:
1 2 3 4 5
SELECT hll_hash_boolean(FALSE, 10); hll_hash_boolean -------------------- 391264977436098630 (1 row)
- hll_hash_smallint(smallint)
返回值类型:hll_hashval
示例:
1 2 3 4 5
SELECT hll_hash_smallint(100::smallint); hll_hash_smallint --------------------- 4631120266694327276 (1 row)
数值大小相同的参数使用不同数据类型的哈希函数计算,最后结果会不一样,因为不同类型哈希函数会选取不同的哈希计算策略。
- hll_hash_smallint(smallint, int32)
描述:设置hash seed(即改变哈希策略)同时对smallint类型数据计算哈希值。
返回值类型:hll_hashval
示例:
1 2 3 4 5
SELECT hll_hash_smallint(100::smallint, 10); hll_hash_smallint --------------------- 8349353095166695771 (1 row)
- hll_hash_integer(integer)
返回值类型:hll_hashval
示例:
1 2 3 4 5
SELECT hll_hash_integer(0); hll_hash_integer ---------------------- -3485513579396041028 (1 row)
- hll_hash_integer(integer, int32)
描述:对integer类型数据计算哈希值,并设置hashseed(即改变哈希策略)。
返回值类型:hll_hashval
示例:
1 2 3 4 5
SELECT hll_hash_integer(0, 10); hll_hash_integer -------------------- 183371090322255134 (1 row)
- hll_hash_bigint(bigint)
返回值类型:hll_hashval
示例:
1 2 3 4 5
SELECT hll_hash_bigint(100::bigint); hll_hash_bigint --------------------- 8349353095166695771 (1 row)
- hll_hash_bigint(bigint, int32)
描述:对bigint类型数据计算哈希值,并设置hashseed(即改变哈希策略)。
返回值类型:hll_hashval
示例:
1 2 3 4 5
SELECT hll_hash_bigint(100::bigint, 10); hll_hash_bigint --------------------- 4631120266694327276 (1 row)
- hll_hash_bytea(bytea)
返回值类型:hll_hashval
示例:
1 2 3 4 5
SELECT hll_hash_bytea(E'\\x'); hll_hash_bytea ---------------- 0 (1 row)
- hll_hash_bytea(bytea, int32)
描述:对bytea类型数据计算哈希值,并设置hashseed(即改变哈希策略)。
返回值类型:hll_hashval
示例:
1 2 3 4 5
SELECT hll_hash_bytea(E'\\x', 10); hll_hash_bytea --------------------- 6574525721897061910 (1 row)
- hll_hash_text(text)
返回值类型:hll_hashval
示例:
1 2 3 4 5
SELECT hll_hash_text('AB'); hll_hash_text --------------------- 5365230931951287672 (1 row)
- hll_hash_text(text, int32)
描述:对text类型数据计算哈希值, 并设置hashseed(即改变哈希策略)。
返回值类型:hll_hashval
示例:
1 2 3 4 5
SELECT hll_hash_text('AB', 10); hll_hash_text --------------------- 7680762839921155903 (1 row)
- hll_hash_any(anytype)
返回值类型:hll_hashval
示例:
1 2 3 4 5 6 7 8 9 10 11
select hll_hash_any(1); hll_hash_any ---------------------- -8604791237420463362 (1 row) select hll_hash_any('08:00:2b:01:02:03'::macaddr); hll_hash_any ---------------------- -4883882473551067169 (1 row)
- hll_hash_any(anytype, int32)
描述:对任意类型数据计算哈希值,并设置hashseed(即改变哈希策略)。
返回值类型:hll_hashval
示例:
1 2 3 4 5
select hll_hash_any(1, 10); hll_hash_any ---------------------- -1478847531811254870 (1 row)
- hll_hashval_eq(hll_hashval, hll_hashval)
返回值类型:bool
示例:
1 2 3 4 5
select hll_hashval_eq(hll_hash_integer(1), hll_hash_integer(1)); hll_hashval_eq ---------------- t (1 row)
- hll_hashval_ne(hll_hashval, hll_hashval)
返回值类型:bool
示例:
1 2 3 4 5
select hll_hashval_ne(hll_hash_integer(1), hll_hash_integer(1)); hll_hashval_ne ---------------- f (1 row)
精度函数
HLL(HyperLogLog)主要存在三种模式Explicit,Sparse,Full。当数据规模比较小的时候会使用Explicit模式和Sparse模式, 这两种模式在计算结果上基本上没有误差。 随着distinct值越来越多,就会转换成Full模式,但结果也会存在一定误差。下列函数用于查看HLL中精度参数。
- hll_schema_version(hll)
示例:
1 2 3 4 5
select hll_schema_version(hll_empty()); hll_schema_version -------------------- 1 (1 row)
- hll_type(hll)
示例:
1 2 3 4 5
select hll_type(hll_empty()); hll_type ---------- 1 (1 row)
- hll_log2m(hll)
描述:查看当前hll的log2m数值,此值会影响最后hll计算distinct误差率,误差率计算公式为
:
示例:
1 2 3 4 5
select hll_log2m(hll_empty()); hll_log2m ----------- 11 (1 row)
- hll_regwidth(hll)
示例:
1 2 3 4 5
select hll_regwidth(hll_empty()); hll_regwidth -------------- 5 (1 row)
- hll_expthresh(hll)
描述:得到当前hll中expthresh大小,hll通常会由Explicit模式到Sparse模式再到Full模式,这个过程称为promotion hierarchy策略。可以通过调整expthresh值的大小改变策略,比如expthresh为0的时候就会跳过Explicit模式而直接进入Sparse模式。当显式指定expthresh的取值为1-7之间时,该函数得到的是 2expthresh。
示例:
1 2 3 4 5 6 7 8 9 10 11
select hll_expthresh(hll_empty()); hll_expthresh --------------- (-1,160) (1 row) select hll_expthresh(hll_empty(11,5,3)); hll_expthresh --------------- (8,8) (1 row)
- hll_sparseon(hll)
示例:
1 2 3 4 5
select hll_sparseon(hll_empty()); hll_sparseon -------------- 1 (1 row)
聚合函数
- hll_add_agg(hll_hashval)
返回值类型:hll
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
--准备数据 create table t_id(id int); insert into t_id values(generate_series(1,500)); create table t_data(a int, c text); insert into t_data select mod(id,2), id from t_id; --创建表并指定列为hll create table t_a_c_hll(a int, c hll); --根据a列group by对数据分组,把各组数据加到hll中 insert into t_a_c_hll select a, hll_add_agg(hll_hash_text(c)) from t_data group by a; --得到每组数据中hll的Distinct值 select a, #c as cardinality from t_a_c_hll order by a; a | cardinality ---+------------------ 0 | 250.741759091658 1 | 250.741759091658 (2 rows)
- hll_add_agg(hll_hashval, int32 log2m)
描述:把哈希后的数据按照分组放到hll中。 并指定参数log2m,取值范围是10到16。
返回值类型:hll
示例:
1 2 3 4 5
Select hll_cardinality(hll_add_agg(hll_hash_text(c), 10)) from t_data; hll_cardinality ------------------ 503.932348927339 (1 row)
- hll_add_agg(hll_hashval, int32 log2m, int32 regwidth)
描述:把哈希后的数据按照分组放到hll中。依次制定参数log2m, regwidth。 regwidth取值范围是1到5。
返回值类型:hll
示例:
1 2 3 4 5
Select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 1)) from t_data; hll_cardinality ------------------ 496.628982624022 (1 row)
- hll_add_agg(hll_hashval, int32 log2m, int32 regwidth, int64 expthresh)
描述:把哈希后的数据按照分组放到hll中, 依次指定参数log2m、regwidth、expthresh。expthresh的取值范围是-1-7之间的整数,该参数可以用来设置从Explicit模式到Sparse模式的阈值大小。-1表示自动模式,0表示跳过Explicit模式,取1-7表示在基数到达 2expthresh时切换模式。
返回值类型:hll
示例:
1 2 3 4 5
Select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 1, 4)) from t_data; hll_cardinality ------------------ 496.628982624022 (1 row)
- hll_add_agg(hll_hashval, int32 log2m, int32 regwidth, int64 expthresh, int32 sparseon)
描述:把哈希后的数据按照分组放到hll中, 依次制定参数log2m、regwidth、expthresh、sparseon,sparseon取值范围是0或者1。
返回值类型:hll
示例:
1 2 3 4 5
Select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 1, 4, 0)) from t_data; hll_cardinality ------------------ 496.628982624022 (1 row)
- hll_union_agg(hll)
返回值类型:hll
示例:
1 2 3 4 5 6
--将各组中的hll数据union成一个hll,并计算distinct值。 select #hll_union_agg(c) as cardinality from t_a_c_hll; cardinality ------------------ 496.628982624022 (1 row)
注意:当两个或者多个hll数据结构做union的时候,必须要保证其中每一个hll里面的精度参数一样,否则将不可以进行union。同样的约束也适用于函数hll_union(hll,hll)。
功能函数
- hll_empty()
返回值类型:hll
示例:
1 2 3 4 5
select hll_empty(); hll_empty ----------- \x118b7f (1 row)
- hll_empty(int32 log2m)
描述:创建空的hll并指定参数log2m,取值范围是10到16。
返回值类型: hll
示例:
1 2 3 4 5
select hll_empty(10); hll_empty ----------- \x118a7f (1 row)
- hll_empty(int32 log2m, int32 regwidth)
描述:创建空的hll并依次指定参数log2m、regwidth。regwidth取值范围是1到5。
返回值类型: hll
示例:
1 2 3 4 5
select hll_empty(10, 4); hll_empty ----------- \x116a7f (1 row)
- hll_empty(int32 log2m, int32 regwidth, int64 expthresh)
描述:创建空的hll并依次指定参数log2m、regwidth、expthresh。expthresh取值范围是-1到7之间的整数。该参数可以用来设置从Explicit模式到Sparse模式的阈值大小。-1表示自动模式,0表示跳过Explicit模式,取1-7表示在基数到达2expthresh时切换模式。
返回值类型:hll
示例:
1 2 3 4 5
select hll_empty(10, 4, 7); hll_empty ----------- \x116a48 (1 row)
- hll_empty(int32 log2m, int32 regwidth, int64 expthresh, int32 sparseon)
描述:创建空的hll并依次指定参数log2m、regwidth、expthresh、sparseon。sparseon取0或者1。
返回值类型:hll
示例:
1 2 3 4 5
select hll_empty(10,4,7,0); hll_empty ----------- \x116a08 (1 row)
- hll_add(hll, hll_hashval)
返回值类型:hll
示例:
1 2 3 4 5
select hll_add(hll_empty(), hll_hash_integer(1)); hll_add -------------------------- \x128b7f8895a3f5af28cafe (1 row)
- hll_add_rev(hll_hashval, hll)
描述:把hll_hashval加入到hll中,和hll_add功能一样,只是参数位置进行了交换。
返回值类型:hll
示例:
1 2 3 4 5
select hll_add_rev(hll_hash_integer(1), hll_empty()); hll_add_rev -------------------------- \x128b7f8895a3f5af28cafe (1 row)
- hll_eq(hll, hll)
返回值类型:bool
示例:
1 2 3 4 5
select hll_eq(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2))); hll_eq -------- f (1 row)
- hll_ne(hll, hll)
返回值类型:bool
示例:
1 2 3 4 5
select hll_ne(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2))); hll_ne -------- t (1 row)
- hll_cardinality(hll)
返回值类型:int
示例:
1 2 3 4 5
select hll_cardinality(hll_empty() || hll_hash_integer(1)); hll_cardinality ----------------- 1 (1 row)
- hll_union(hll, hll)
返回值类型:hll
示例:
1 2 3 4 5
select hll_union(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2))); hll_union ------------------------------------------ \x128b7f8895a3f5af28cafeda0ce907e4355b60 (1 row)
内置函数
HLL(HyperLogLog)有一系列内置函数用于内部对数据进行处理,一般情况下用户不需要熟知这些函数的使用。详情见表1。
函数名称 |
功能描述 |
---|---|
hll_in |
以string格式接收hll数据。 |
hll_out |
以string格式发送hll数据。 |
hll_recv |
以bytea格式接收hll数据。 |
hll_send |
以bytea格式发送hll数据。 |
hll_trans_in |
以string格式接收hll_trans_type数据。 |
hll_trans_out |
以string格式发送hll_trans_type数据。 |
hll_trans_recv |
以bytea形式接收hll_trans_type数据。 |
hll_trans_send |
以bytea形式发送hll_trans_type数据。 |
hll_typmod_in |
接收typmod类型数据。 |
hll_typmod_out |
发送typmod类型数据。 |
hll_hashval_in |
接收hll_hashval类型数据。 |
hll_hashval_out |
发送hll_hashval类型数据。 |
hll_add_trans0 |
类似于hll_add所提供的功能, 通常在分布式聚合运算的第一阶段DN上使用。 |
hll_union_trans |
类似hll_union所提供的功能,在分布式聚合运算的第一阶段DN上使用。 |
hll_union_collect |
类似于hll_union所提供的功能,在分布式聚合运算第二阶段CN上使用,汇总各个DN上的结果。 |
hll_pack |
在分布式聚合运算第三阶段CN上使用,把自定义hll_trans_type类型最后转换成hll类型。 |
hll |
用于hll类型转换成hll类型,根据输入参数会设定指定参数。 |
hll_hashval |
用于bigint类型转换成hll_hashval类型。 |
hll_hashval_int4 |
用于int4类型转换成hll_hashval类型。 |
操作符
- <> or !=
返回值类型:bool
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
--hll select (hll_empty() || hll_hash_integer(1)) <> (hll_empty() || hll_hash_integer(2)); ?column? ---------- t (1 row) --hll_hashval select hll_hash_integer(1) <> hll_hash_integer(2); ?column? ---------- t (1 row)
- ||
描述:可代表hll_add, hll_union, hll_add_rev三个函数的功能。
返回值类型:hll
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
--hll_add select hll_empty() || hll_hash_integer(1); ?column? -------------------------- \x128b7f8895a3f5af28cafe (1 row) --hll_add_rev select hll_hash_integer(1) || hll_empty(); ?column? -------------------------- \x128b7f8895a3f5af28cafe (1 row) --hll_union select (hll_empty() || hll_hash_integer(1)) || (hll_empty() || hll_hash_integer(2)); ?column? ------------------------------------------ \x128b7f8895a3f5af28cafeda0ce907e4355b60 (1 row)
- #
描述:计算出hll的Dintinct值, 同hll_cardinality函数。
返回值类型:int
示例:
1 2 3 4 5
select #(hll_empty() || hll_hash_integer(1)); ?column? ---------- 1 (1 row)