文档首页 > > 开发指南> SQL参考> 函数和操作符> HLL函数和操作符

HLL函数和操作符

分享
更新时间: 2019/11/12 GMT+08:00

哈希函数

  • hll_hash_boolean(bool)

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

    返回值:hll_hashval

    示例:
    SELECT hll_hash_boolean(FALSE);
      hll_hash_boolean   
    ---------------------
     5048724184180415669
    (1 row)
  • hll_hash_smallint(smallint)

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

    返回值:hll_hashval

    示例:

    SELECT hll_hash_smallint(100::smallint);
      hll_hash_smallint  
    ---------------------
     4631120266694327276
    (1 row)

数值大小相同的参数使用不同数据类型的哈希函数计算,最后结果会不一样,因为不同类型哈希函数会选取不同的哈希计算策略。

  • hll_hash_integer(integer)

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

    返回值:hll_hashval

    示例:

    SELECT hll_hash_integer(0);
       hll_hash_integer   
    ----------------------
     -3485513579396041028
    (1 row)
  • hll_hash_bigint(bigint)

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

    返回值:hll_hashval

    示例:

    SELECT hll_hash_bigint(100::bigint);
       hll_hash_bigint   
    ---------------------
     8349353095166695771
    (1 row)
  • hll_hash_bytea(bytea)

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

    返回值:hll_hashval

    示例:

    SELECT hll_hash_bytea(E'\\x');
     hll_hash_bytea 
    ----------------
     0
    (1 row)
  • hll_hash_text(text)

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

    返回值:hll_hashval

    示例:

    SELECT hll_hash_text('AB');
        hll_hash_text    
    ---------------------
     5365230931951287672
    (1 row)
  • hll_hash_any(anytype)

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

    返回值:hll_hashval

    示例:

    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_hashval_eq(hll_hashval, hll_hashval)

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

    返回值:bool

    示例:

    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)

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

    返回值:bool

    示例:

    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)

    描述:查看当前hll中的schema version。

    示例:

    select hll_schema_version(hll_empty());
     hll_schema_version 
    --------------------
               1
    (1 row)
  • hll_type(hll)

    描述:查看当前hll的类型。

    示例:

    select hll_type(hll_empty());
     hll_type 
    ----------
            1
    (1 row)
  • hll_log2m(hll)

    描述:查看当前hll的log2m数值,此值会影响最后hll计算distinct误差率,误差率计算公式为±1.04/√(2 ^ log2m)。

    示例:

    select hll_log2m(hll_empty());
     hll_log2m 
    -----------
            11
    (1 row)
  • hll_regwidth(hll)

    描述:查看hll数据结构中桶的位数大小。

    示例:

    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模式。

    示例:

    select hll_expthresh(hll_empty());
     hll_expthresh 
    ---------------
     (-1,160)
    (1 row)
  • hll_sparseon(hll)

    描述:是否启用sparseon模式,0是关闭,1是开启。

    示例:

    select hll_sparseon(hll_empty());
     hll_sparseon 
    --------------
            1
    (1 row)

聚合函数

  • hll_add_agg(hll_hashval)

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

    返回值:hll

    示例:

    --准备数据
    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_union_agg(hll)

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

    返回值:hll

    示例:

    --将各组中的hll数据union成一个hll,并计算distinct值。
    select #hll_union_agg(c) as cardinality from t_a_c_hll;
       cardinality    
    ------------------
     496.628982624022
    (1 row)

功能函数

  • hll_print(hll)

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

    示例:

    select hll_print(hll_empty());
                             hll_print                         
    -----------------------------------------------------------
     EMPTY, nregs=2048, nbits=5, expthresh=-1(160), sparseon=1gongne
    (1 row)
  • hll_empty()

    描述:创建一个空的hll。

    返回值:hll

    示例:

    select hll_empty();
     hll_empty 
    -----------
     \x118b7f
    (1 row)
  • hll_add(hll, hll_hashval)

    描述:把hll_hashval加入到hll中。

    返回值:hll

    示例:

    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

    示例:

    select hll_add_rev(hll_hash_integer(1), hll_empty());
           hll_add_rev        
    --------------------------
     \x128b7f8895a3f5af28cafe
    (1 row)
  • hll_eq(hll, hll)

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

    返回值:bool

    示例:

    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)

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

    返回值:bool

    示例:

    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)

    描述:计算hll的distinct值。

    返回值:int

    示例:

    select hll_cardinality(hll_empty() || hll_hash_integer(1));
     hll_cardinality 
    -----------------
                   1
    (1 row)
  • hll_union(hll, hll)

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

    返回值:hll

    示例:

    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

表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类型。

操作符

  • =

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

    返回值:bool

    示例:

    --hll
    select (hll_empty() || hll_hash_integer(1)) = (hll_empty() || hll_hash_integer(1));
    column 
    ----------
     t
    (1 row)
    
    --hll_hashval
    select hll_hash_integer(1) = hll_hash_integer(1);
     ?column? 
    ----------
     t
    (1 row)
  • <>

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

    返回值:bool

    示例:

    --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

    示例:

    --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

    示例:

    select #(hll_empty() || hll_hash_integer(1));
     ?column? 
    ----------
            1
    (1 row)
  • ::

    描述:强行转换数据类型。

    示例:

    --把integer类型转换成text类型
    select 123::text;
     text 
    ------
     123
    (1 row)
分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区