HLL函数

HLL是基于HyperLogLog算法的工程实现,用于保存HyperLogLog计算过程的中间结果,它只能作为表的value列类型、通过聚合来不断的减少数据量,以此来实现加快查询的目的,基于它得到的是一个估算结果,误差大概在1%左右,hll列是通过其它列或者导入数据里面的数据生成的,导入的时候通过hll_hash函数来指定数据中哪一列用于生成hll列,它常用于替代count distinct,通过结合rollup在业务上用于快速计算uv等

HLL_UNION_AGG(hll)

此函数为聚合函数,用于计算满足条件的所有数据的基数估算。

HLL_CARDINALITY(hll)

此函数用于计算单条hll列的基数估算

HLL_HASH(column_name)

生成HLL列类型,用于insert或导入的时候,导入的使用见相关说明

example:(仅为说明使用方式)

1、首先创建一张含有hll列的表:

  1. create table test(
  2. time date,
  3. id int,
  4. name char(10),
  5. province char(10),
  6. os char(1),
  7. set1 hll hll_union,
  8. set2 hll hll_union)
  9. distributed by hash(id) buckets 32;

2、导入数据,导入的方式见相关help mini load

  1. 1)使用表中的列生成hll
  2. curl --location-trusted -uname:password -T data http://host/api/test_db/test/_load?label=load_1\&hll=set1,id:set2,name
  3. 2)使用数据中的某一列生成hll
  4. curl --location-trusted -uname:password -T data http://host/api/test_db/test/_load?label=load_1\&hll=set1,cuid:set2,os\&columns=time,id,name,province,sex,cuid,os

3、聚合数据,常用方式3种:(如果不聚合直接对base表查询,速度可能跟直接使用ndv速度差不多)

  1. 1)创建一个rollup,让hll列产生聚合,
  2. alter table test add rollup test_rollup(date, set1);
  3. 2)创建另外一张专门计算uv的表,然后insert数据)
  4. create table test_uv(
  5. time date,
  6. uv_set hll hll_union)
  7. distributed by hash(id) buckets 32;
  8. insert into test_uv select date, set1 from test;
  9. 3)创建另外一张专门计算uv的表,然后insert并通过hll_hash根据test其它非hll列生成hll
  10. create table test_uv(
  11. time date,
  12. id_set hll hll_union)
  13. distributed by hash(id) buckets 32;
  14. insert into test_uv select date, hll_hash(id) from test;

4、查询,hll列不允许直接查询它的原始值,可以通过配套的函数进行查询

  1. 1)求总uv
  2. select HLL_UNION_AGG(uv_set) from test_uv;
  3. 2)求每一天的uv
  4. select HLL_CARDINALITY(uv_set) from test_uv;