HLL函数和操作符

    • 描述:对bool类型数据计算哈希值。

      返回值类型:hll_hashval

      示例:

    • hll_hash_boolean(bool, int32)

      描述:设置hash seed(即改变哈希策略)并对bool类型数据计算哈希值。

      返回值类型:hll_hashval

      示例:

      1. hll_hash_boolean
      2. --------------------
      3. -1169037589280886076
      4. (1 row)
    • hll_hash_smallint(smallint)

      描述:对smallint类型数据计算哈希值。

      返回值类型:hll_hashval

      示例:

      1. openGauss=# SELECT hll_hash_smallint(100::smallint);
      2. hll_hash_smallint
      3. ---------------------
      4. 962727970174027904
      5. (1 row)
    • hll_hash_smallint(smallint, int32)

      描述:设置hash seed(即改变哈希策略)同时对smallint类型数据计算哈希值。

      返回值类型:hll_hashval

      示例:

      1. openGauss=# SELECT hll_hash_smallint(100::smallint, 10);
      2. hll_hash_smallint
      3. ---------------------
      4. -9056177146160443041
      5. (1 row)
    • hll_hash_integer(integer)

      描述:对integer类型数据计算哈希值。

      返回值类型:hll_hashval

      示例:

      1. openGauss=# SELECT hll_hash_integer(0);
      2. hll_hash_integer
      3. ----------------------
      4. 5156626420896634997
      5. (1 row)
    • hll_hash_integer(integer, int32)

      描述:对integer类型数据计算哈希值,并设置hashseed(即改变哈希策略)。

      返回值类型:hll_hashval

      示例:

      1. openGauss=# SELECT hll_hash_integer(0, 10);
      2. hll_hash_integer
      3. --------------------
      4. -5035020264353794276
      5. (1 row)
    • hll_hash_bigint(bigint)

      描述:对bigint类型数据计算哈希值。

      返回值类型:hll_hashval

      示例:

      1. openGauss=# SELECT hll_hash_bigint(100::bigint);
      2. hll_hash_bigint
      3. ---------------------
      4. -2401963681423227794
      5. (1 row)
    • hll_hash_bigint(bigint, int32)

      描述:对bigint类型数据计算哈希值,并设置hashseed(即改变哈希策略)。

      返回值类型:hll_hashval

      示例:

      1. openGauss=# SELECT hll_hash_bigint(100::bigint, 10);
      2. hll_hash_bigint
      3. ---------------------
      4. -2305749404374433531
      5. (1 row)
    • hll_hash_bytea(bytea)

      描述:对bytea类型数据计算哈希值。

      返回值类型:hll_hashval

      示例:

      1. openGauss=# SELECT hll_hash_bytea(E'\\x');
      2. hll_hash_bytea
      3. ----------------
      4. 0
      5. (1 row)
    • hll_hash_bytea(bytea, int32)

      描述:对bytea类型数据计算哈希值,并设置hashseed(即改变哈希策略)。

      返回值类型:hll_hashval

      示例:

      1. openGauss=# SELECT hll_hash_bytea(E'\\x', 10);
      2. hll_hash_bytea
      3. ---------------------
      4. 7233188113542599437
      5. (1 row)
    • hll_hash_text(text)

      描述:对text类型数据计算哈希值。

      返回值类型:hll_hashval

      示例:

      1. openGauss=# SELECT hll_hash_text('AB');
      2. hll_hash_text
      3. ---------------------
      4. -5666002586880275174
      5. (1 row)
    • hll_hash_text(text, int32)

      描述:对text类型数据计算哈希值,并设置hashseed(即改变哈希策略)。

      返回值类型:hll_hashval

      示例:

      1. openGauss=# SELECT hll_hash_text('AB', 10);
      2. hll_hash_text
      3. ---------------------
      4. -2215507121143724132
      5. (1 row)
    • hll_hash_any(anytype)

      描述:对任意类型数据计算哈希值。

      返回值类型:hll_hashval

      示例:

      1. openGauss=# select hll_hash_any(1);
      2. hll_hash_any
      3. ----------------------
      4. -1316670585935156930
      5. (1 row)
      6. openGauss=# select hll_hash_any('08:00:2b:01:02:03'::macaddr);
      7. hll_hash_any
      8. ----------------------
      9. -3719950434455589360
      10. (1 row)
    • hll_hash_any(anytype, int32)

      描述:对任意类型数据计算哈希值,并设置hashseed(即改变哈希策略)。

      返回值类型:hll_hashval

      示例:

      1. openGauss=# select hll_hash_any(1, 10);
      2. hll_hash_any
      3. ----------------------
      4. 7048553517657992351
      5. (1 row)
    • hll_hashval_eq(hll_hashval, hll_hashval)

      描述:比较两个hll_hashval类型数据是否相等。

      返回值类型:bool

      示例:

    • hll_hashval_ne(hll_hashval, hll_hashval)

      描述:比较两个hll_hashval类型数据是否不相等。

      返回值类型:bool

      示例:

      1. openGauss=# select hll_hashval_ne(hll_hash_integer(1), hll_hash_integer(1));
      2. hll_hashval_ne
      3. ----------------
      4. f
      5. (1 row)

    日志函数

    hll主要存在三种模式Explicit,Sparse,Full。当数据规模比较小的时候会使用Explicit模式,这种模式下distinct值的计算是没有误差的;随着distinct值越来越多,hll会先后转换为Sparse模式和Full模式,这两种模式在计算结果上没有任何区别,只影响hll函数的计算效率和hll对象的存储空间。下面的函数可以用于查看hll的一些参数。

    • hll_print(hll)

      描述:打印hll的一些debug参数信息。

      示例:

      1. openGauss=# select hll_print(hll_empty());
      2. hll_print
      3. -------------------------------------------------------------------------------
      4. type=1(HLL_EMPTY), log2m=14, log2explicit=10, log2sparse=12, duplicatecheck=0
      5. (1 row)
    • hll_type(hll)

      描述:查看当前hll的类型。返回值具体含义如下:返回值0,表示HLL_UNINIT,未初始化的hll对象;返回值1,表示HLL_EMPTY,hll空对象;返回值2,表示HLL_EXPLICIT,Explicit模式的hll对象;返回值3,表示HLL_SPARSE,Sparse模式的hll对象;返回值4,表示HLL_FULL,Full模式的hll对象;返回值5,表示HLL_UNDEFINED,不合法的hll对象。

      示例:

      1. openGauss=# select hll_type(hll_empty());
      2. hll_type
      3. ----------
      4. 1
      5. (1 row)
    • hll_log2m(hll)

      描述:查看当前hll数据结构中的log2m数值,log2m是分桶数的对数值,此值会影响最后hll计算distinct误差率,误差率计算公式为±1.04/√(2 ^ log2m)。当显式指定log2m的取值为10-16之间时,hll会设置分桶数为2log2m。当显示指定log2explicit为-1时,会采用内置默认值。

      示例:

      1. openGauss=# select hll_log2m(hll_empty());
      2. hll_log2m
      3. -----------
      4. 14
      5. (1 row)
      6. openGauss=# select hll_log2m(hll_empty(10));
      7. hll_log2m
      8. -----------
      9. 10
      10. (1 row)
      11. openGauss=# select hll_log2m(hll_empty(-1));
      12. hll_log2m
      13. -----------
      14. 14
      15. (1 row)
    • hll_log2explicit(hll)

      示例:

      1. openGauss=# select hll_log2explicit(hll_empty());
      2. hll_log2explicit
      3. ------------------
      4. (1 row)
      5. openGauss=# select hll_log2explicit(hll_empty(12, 8));
      6. hll_log2explicit
      7. ------------------
      8. 8
      9. (1 row)
      10. openGauss=# select hll_log2explicit(hll_empty(12, -1));
      11. hll_log2explicit
      12. ------------------
      13. 10
      14. (1 row)
    • hll_log2sparse(hll)

      描述:查看当前hll数据结构中的log2sparse数值。hll通常会由Explicit模式到Sparse模式再到Full模式,这个过程称为promotion hierarchy策略。可以通过调整log2sparse值的大小改变策略,比如log2sparse为0的时候就会跳过Sparse模式而直接进入Full模式。当显式指定Sparse的取值为1-14之间时,hll会在数据段长度超过2log2sparse时转为Full模式。当显示指定log2sparse为-1时,会采用内置默认值。

      示例:

      1. openGauss=# select hll_log2sparse(hll_empty());
      2. hll_log2sparse
      3. ----------------
      4. 12
      5. (1 row)
      6. openGauss=# select hll_log2sparse(hll_empty(12, 8, 10));
      7. hll_log2sparse
      8. ----------------
      9. 10
      10. (1 row)
      11. openGauss=# select hll_log2sparse(hll_empty(12, 8, -1));
      12. hll_log2sparse
      13. ----------------
      14. 12
      15. (1 row)
    • hll_duplicatecheck(hll)

      描述:是否启用duplicatecheck,0是关闭,1是开启。默认关闭,对于有较多重复值出现的情况,可以开启以提高效率。当显示指定duplicatecheck为-1时,会采用内置默认值。

      示例:

      1. openGauss=# select hll_duplicatecheck(hll_empty());
      2. hll_duplicatecheck
      3. --------------------
      4. 0
      5. (1 row)
      6. openGauss=# select hll_duplicatecheck(hll_empty(12, 8, 10, 1));
      7. hll_duplicatecheck
      8. --------------------
      9. 1
      10. (1 row)
      11. openGauss=# select hll_duplicatecheck(hll_empty(12, 8, 10, -1));
      12. hll_duplicatecheck
      13. --------------------
      14. 0
      15. (1 row)
    • hll_empty()

      描述:创建一个空的hll。

      返回值类型:hll

      示例:

      1. openGauss=# select hll_empty();
      2. hll_empty
      3. ------------------------------------------------------------
      4. \x484c4c00000000002b05000000000000000000000000000000000000
      5. (1 row)
    • hll_empty(int32 log2m)

      描述:创建空的hll并指定参数log2m,取值范围是10到16。若输入-1,则采用内置默认值。

      返回值类型:hll

      示例:

      1. openGauss=# select hll_empty(10);
      2. hll_empty
      3. ------------------------------------------------------------
      4. \x484c4c00000000002b04000000000000000000000000000000000000
      5. (1 row)
      6. openGauss=# select hll_empty(-1);
      7. hll_empty
      8. ------------------------------------------------------------
      9. \x484c4c00000000002b05000000000000000000000000000000000000
      10. (1 row)
    • hll_empty(int32 log2m, int32 log2explicit)

      描述:创建空的hll并依次指定参数log2m、log2explicit。log2explicit取值范围是0到12,0表示直接跳过Explicit模式。该参数可以用来设置Explicit模式的阈值大小,在数据段长度达到2log2explicit后切换为Sparse模式或者Full模式。若输入-1,则log2explicit采用内置默认值。

      返回值类型: hll

      示例:

      1. openGauss=# select hll_empty(10, 4);
      2. hll_empty
      3. ------------------------------------------------------------
      4. \x484c4c00000000001304000000000000000000000000000000000000
      5. (1 row)
      6. openGauss=# select hll_empty(10, -1);
      7. hll_empty
      8. ------------------------------------------------------------
      9. \x484c4c00000000002b04000000000000000000000000000000000000
      10. (1 row)
    • hll_empty(int32 log2m, int32 log2explicit, int64 log2sparse)

      描述:创建空的hll并依次指定参数log2m、log2explicit、log2sparse。log2sparse取值范围是0到14,0表示直接跳过Sparse模式。该参数可以用来设置Sparse模式的阈值大小,在数据段长度达到2log2sparse后切换为Full模式。若输入-1,则log2sparse采用内置默认值。

      返回值类型:hll

      示例:

      1. openGauss=# select hll_empty(10, 4, 8);
      2. hll_empty
      3. ------------------------------------------------------------
      4. \x484c4c00000000001204000000000000000000000000000000000000
      5. (1 row)
      6. openGauss=# select hll_empty(10, 4, -1);
      7. hll_empty
      8. ------------------------------------------------------------
      9. \x484c4c00000000001304000000000000000000000000000000000000
      10. (1 row)
    • hll_empty(int32 log2m, int32 log2explicit, int64 log2sparse, int32 duplicatecheck)

      描述:创建空的hll并依次指定参数log2m、log2explicit、log2sparse、duplicatecheck。duplicatecheck取0或者1,表示是否开启该模式,默认情况下该模式会关闭。若输入-1,则duplicatecheck采用内置默认值。

      返回值类型:hll

      示例:

      1. openGauss=# select hll_empty(10, 4, 8, 0);
      2. hll_empty
      3. ------------------------------------------------------------
      4. \x484c4c00000000001204000000000000000000000000000000000000
      5. (1 row)
      6. openGauss=# select hll_empty(10, 4, 8, -1);
      7. hll_empty
      8. ------------------------------------------------------------
      9. \x484c4c00000000001204000000000000000000000000000000000000
      10. (1 row)
    • hll_add(hll, hll_hashval)

      描述:把hll_hashval加入到hll中。

      返回值类型:hll

      示例:

      1. openGauss=# select hll_add(hll_empty(), hll_hash_integer(1));
      2. hll_add
      3. ----------------------------------------------------------------------------
      4. \x484c4c08000002002b0900000000000000f03f3e2921ff133fbaed3e2921ff133fbaed00
      5. (1 row)
    • hll_add_rev(hll_hashval, hll)

      描述:把hll_hashval加入到hll中,和hll_add功能一样,只是参数位置进行了交换。

      返回值类型:hll

      示例:

    • hll_eq(hll, hll)

      描述:比较两个hll是否相等。

      返回值类型:bool

      示例:

      1. openGauss=# select hll_eq(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2)));
      2. hll_eq
      3. f
    • hll_ne(hll, hll)

      描述:比较两个hll是否不相等。

      返回值类型:bool

      示例:

      1. openGauss=# select hll_ne(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2)));
      2. hll_ne
      3. --------
      4. t
      5. (1 row)
    • hll_cardinality(hll)

      描述:计算hll的distinct值。

      返回值类型:int

      示例:

      1. openGauss=# select hll_cardinality(hll_empty() || hll_hash_integer(1));
      2. hll_cardinality
      3. -----------------
      4. 1
      5. (1 row)
    • hll_union(hll, hll)

      描述:把两个hll数据结构union成一个。

      返回值类型:hll

      示例:

      1. openGauss=# select hll_union(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2)));
      2. hll_union
      3. --------------------------------------------------------------------------------------------
      4. \x484c4c10002000002b090000000000000000400000000000000000b3ccc49320cca1ae3e2921ff133fbaed00
      5. (1 row)

    聚合函数

    • hll_add_agg(hll_hashval)

      描述:把哈希后的数据按照分组放到hll中。

      返回值类型:hll

      示例:

      1. --准备数据
      2. openGauss=# create table t_id(id int);
      3. openGauss=# insert into t_id values(generate_series(1,500));
      4. openGauss=# create table t_data(a int, c text);
      5. openGauss=# insert into t_data select mod(id,2), id from t_id;
      6. --创建表并指定列为hll
      7. openGauss=# create table t_a_c_hll(a int, c hll);
      8. --根据agroup by对数据分组,把各组数据加到hll
      9. openGauss=# insert into t_a_c_hll select a, hll_add_agg(hll_hash_text(c)) from t_data group by a;
      10. --得到每组数据中hllDistinct
      11. openGauss=# select a, #c as cardinality from t_a_c_hll order by a;
      12. a | cardinality
      13. ---+------------------
      14. 0 | 247.862354346299
      15. 1 | 250.908710610377
      16. (2 rows)
    • hll_add_agg(hll_hashval, int32 log2m)

      描述:把哈希后的数据按照分组放到hll中,并指定参数log2m,取值范围是10到16。若输入-1或者NULL,则采用内置默认值。

      返回值类型:hll

      示例:

      1. openGauss=# select hll_cardinality(hll_add_agg(hll_hash_text(c), 12)) from t_data;
      2. hll_cardinality
      3. ------------------
      4. 497.965240179228
      5. (1 row)
    • hll_add_agg(hll_hashval, int32 log2m, int32 log2explicit)

      描述:把哈希后的数据按照分组放到hll中,依次指定参数log2m、log2explicit。log2explicit取值范围是0到12,0表示直接跳过Explicit模式。该参数可以用来设置Explicit模式的阈值大小,在数据段长度达到2log2explicit后切换为Sparse模式或者Full模式。若输入-1或者NULL,则log2explicit采用内置默认值。

      返回值类型:hll

      示例:

      1. openGauss=# select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 1)) from t_data;
      2. hll_cardinality
      3. ------------------
      4. 498.496062953313
      5. (1 row)
    • hll_add_agg(hll_hashval, int32 log2m, int32 log2explicit, int64 log2sparse)

      描述:把哈希后的数据按照分组放到hll中,依次指定参数log2m、log2explicit、log2sparse。log2sparse取值范围是0到14,0表示直接跳过Sparse模式。该参数可以用来设置Sparse模式的阈值大小,在数据段长度达到2log2sparse后切换为Full模式。若输入-1或者NULL,则log2sparse采用内置默认值。

      返回值类型:hll

      示例:

      1. openGauss=# select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 6, 10)) from t_data;
      2. hll_cardinality
      3. ------------------
      4. 498.496062953313
      5. (1 row)
    • hll_add_agg(hll_hashval, int32 log2m, int32 log2explicit, int64 log2sparse, int32 duplicatecheck)

      描述:把哈希后的数据按照分组放到hll中, 依次制定参数log2m、log2explicit、log2sparse、duplicatecheck,duplicatecheck取值范围是0或者1,表示是否开启该模式,默认情况下该模式会关闭。若输入-1或者NULL,则duplicatecheck采用内置默认值。

      返回值类型:hll

      示例:

      1. openGauss=# select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 6, 10, -1)) from t_data;
      2. hll_cardinality
      3. ------------------
      4. 498.496062953313
      5. (1 row)
    • hll_union_agg(hll)

      描述:将多个hll类型数据union成一个hll。

      返回值类型:hll

      示例:

      1. --将各组中的hll数据union成一个hll,并计算distinct值。
      2. openGauss=# select #hll_union_agg(c) as cardinality from t_a_c_hll;
      3. cardinality
      4. ------------------
      5. 498.496062953313
      6. (1 row)

      说明:

    由于版本升级,HLL(HyperLogLog)有一些旧的函数废弃,用户可以用类似的函数进行替代。

    • hll_schema_version(hll)

      描述:查看当前hll中的schema version。旧版本schema version是常值1,用来进行hll字段的头部校验,重构后的hll在头部增加字段“HLL”进行校验,schema version不再使用。

    • hll_regwidth(hll)

      描述:查看hll数据结构中桶的位数大小。旧版本桶的位数regwidth取值1~5,会存在较大的误差,也限制了基数估计上限。 重构后regwidth为固定值6,不再使用regwidth变量。

    • hll_expthresh(hll)

      描述:得到当前hll中expthresh大小。采用hll_log2explicit(hll)替代类似功能。

    • hll_sparseon(hll)

      描述:是否启用Sparse模式。采用hll_log2sparse(hll)替代类似功能,0表示关闭Sparse模式。

    内置函数

    HLL(HyperLogLog)有一系列内置函数用于内部对数据进行处理,一般情况下用户不需要熟知这些函数的使用。详情见。

    表 1 内置函数

    • =

      描述:比较hll或hll_hashval的值是否相等。

      返回值类型:bool

      示例:

      1. --hll
      2. openGauss=# select (hll_empty() || hll_hash_integer(1)) = (hll_empty() || hll_hash_integer(1));
      3. column
      4. ----------
      5. t
      6. (1 row)
      7. --hll_hashval
      8. openGauss=# select hll_hash_integer(1) = hll_hash_integer(1);
      9. ?column?
      10. ----------
      11. t
      12. (1 row)
    • <> or !=

      描述:比较hll或hll_hashval是否不相等。

      返回值类型:bool

      示例:

      1. --hll
      2. openGauss=# select (hll_empty() || hll_hash_integer(1)) <> (hll_empty() || hll_hash_integer(2));
      3. ?column?
      4. ----------
      5. t
      6. (1 row)
      7. --hll_hashval
      8. openGauss=# select hll_hash_integer(1) <> hll_hash_integer(2);
      9. ?column?
      10. ----------
      11. t
      12. (1 row)
    • ||

      描述:可代表hll_add,hll_union,hll_add_rev三个函数的功能。

      返回值类型:hll

      示例:

      1. --hll_add
      2. openGauss=# select hll_empty() || hll_hash_integer(1);
      3. ?column?
      4. ----------------------------------------------------------------------------
      5. \x484c4c08000002002b0900000000000000f03f3e2921ff133fbaed3e2921ff133fbaed00
      6. (1 row)
      7. --hll_add_rev
      8. openGauss=# select hll_hash_integer(1) || hll_empty();
      9. ?column?
      10. ----------------------------------------------------------------------------
      11. \x484c4c08000002002b0900000000000000f03f3e2921ff133fbaed3e2921ff133fbaed00
      12. (1 row)
      13. --hll_union
      14. openGauss=# select (hll_empty() || hll_hash_integer(1)) || (hll_empty() || hll_hash_integer(2));
      15. ?column?
      16. --------------------------------------------------------------------------------------------
      17. \x484c4c10002000002b090000000000000000400000000000000000b3ccc49320cca1ae3e2921ff133fbaed00
    • #

      描述:计算出hll的Dintinct值, 同hll_cardinality函数。

      返回值类型:int

      示例: