全部產品
Search
文件中心

PolarDB:hll

更新時間:Jul 06, 2024

hll外掛程式支援的資料類型HyperLogLog(hll)可以協助您快速預估PV、UV等業務指標。

背景資訊

hll外掛程式支援一種可變長、類似集合的資料類型HyperLogLog(hll),常用於在指定精度下返回近似的distinct值,例如,1280位元組的hll資料類型可以高精度地估計出近百億的distinct值。hll適合互連網廣告分析或其他有類似預估分析計算需求的行業,可以快速預估PV、UV等業務指標。

建立hll外掛程式

CREATE EXTENSION hll;

基礎操作

  • 建立一個含有hll欄位的表,命令如下:

    CREATE TABLE agg (id INT PRIMARY KEY, userids hll);
  • 將int資料類型轉換為hll_hashval類型,命令如下:

    SELECT 1::hll_hashval;

基本操作符

  • hll類型支援如下操作符:

    • =

    • !=

    • <>

    • ||

    • #

    樣本如下:

    SELECT hll_add_agg(1::hll_hashval) = hll_add_agg(2::hll_hashval);
    SELECT hll_add_agg(1::hll_hashval) || hll_add_agg(2::hll_hashval);
    SELECT #hll_add_agg(1::hll_hashval);
  • hll_hashval類型支援如下操作符:

    • =

    • !=

    • <>

    樣本如下:

    SELECT 1::hll_hashval = 2::hll_hashval;
    SELECT 1::hll_hashval <> 2::hll_hashval;

基本函數

  • 支援hll_hash_boolean、hll_hash_smallint和hll_hash_bigint等hash函數,樣本如下:

    SELECT hll_hash_boolean(true);
    SELECT hll_hash_integer(1);
  • 支援hll_add_agg函數,可以將int轉換為hll格式,樣本如下:

    SELECT hll_add_agg(1::hll_hashval);
  • 支援hll_union函數,可以將hll並集,樣本如下:

    SELECT hll_union(hll_add_agg(1::hll_hashval), hll_add_agg(2::hll_hashval));
  • 支援hll_set_defaults函數,可以設定精度,樣本如下:

    SELECT hll_set_defaults(15,5,-1,1);
  • 支援hll_print函數,用於列印debug資訊,樣本如下:

    SELECT hll_print(hll_add_agg(1::hll_hashval));

刪除hll外掛程式

DROP EXTENSION hll;

樣本

CREATE TABLE access_date (acc_date DATE UNIQUE, userids hll);
INSERT INTO access_date
     SELECT current_date, hll_add_agg(hll_hash_integer(user_id))
     FROM generate_series(1,10000) t(user_id);
INSERT INTO access_date
     SELECT current_date-1, hll_add_agg(hll_hash_integer(user_id))
     FROM generate_series(5000,20000) t(user_id);
INSERT INTO access_date
     SELECT current_date-2, hll_add_agg(hll_hash_integer(user_id))
     FROM generate_series(9000,40000) t(user_id);

SELECT #userids FROM access_date WHERE acc_date=current_date;
     ?column?
------------------
 9725.852733707077
(1 row)

SELECT #userids FROM access_date WHERE acc_date=current_date-1;
     ?column?
------------------
 14968.65968832792
(1 row)

SELECT #userids FROM access_date WHERE acc_date=current_date-2;
     ?column?
------------------
 29361.520914991113
(1 row)