全部產品
Search
文件中心

PolarDB:hll(近似集合)

更新時間:Oct 26, 2024

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

前提條件

支援的PolarDB PostgreSQL版(相容Oracle)的版本如下:

Oracle文法相容 2.0(核心小版本2.0.14.1.0及以上)

說明

您可通過如下語句查看PolarDB PostgreSQL版(相容Oracle)的核心小版本號碼:

SHOW polar_version;

背景資訊

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_hashval 
    -------------
     1
    (1 row)

基本操作符

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

    • =

    • !=

    • <>

    • ||

    • #

    樣本如下:

    • =

      SELECT hll_add_agg(1::hll_hashval) = hll_add_agg(2::hll_hashval);

      返回結果如下:

       ?column? 
      ----------
       f
      (1 row)
    • ||

      SELECT hll_add_agg(1::hll_hashval) || hll_add_agg(2::hll_hashval);

      返回結果如下:

                       ?column?                 
      ------------------------------------------
       \x128b7f00000000000000010000000000000002
      (1 row)
    • #

      SELECT #hll_add_agg(1::hll_hashval);

      返回結果如下:

       ?column? 
      ----------
              1
      (1 row)
  • hll_hashval類型支援如下操作符:

    • =

    • !=

    • <>

    樣本如下:

    • =

      SELECT 1::hll_hashval = 2::hll_hashval;

      返回結果如下:

       ?column? 
      ----------
       f
      (1 row)
    • <>

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

      返回結果如下:

       ?column? 
      ----------
       t
      (1 row)

基本函數

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

    • SELECT hll_hash_boolean(true);

      返回結果如下:

        hll_hash_boolean   
      ---------------------
       8849112093580131862
      (1 row)
    • SELECT hll_hash_integer(1);

      返回結果如下:

         hll_hash_integer   
      ----------------------
       -8604791237420463362
      (1 row)
  • 支援hll_add_agg函數,可以將int轉換為hll格式,樣本如下:

    SELECT hll_add_agg(1::hll_hashval);

    返回結果如下:

           hll_add_agg        
    --------------------------
     \x128b7f0000000000000001
    (1 row)
  • 支援hll_union函數,可以將hll並集,樣本如下:

    SELECT hll_union(hll_add_agg(1::hll_hashval), hll_add_agg(2::hll_hashval));

    返回結果如下:

                    hll_union                 
    ------------------------------------------
     \x128b7f00000000000000010000000000000002
    (1 row)
  • 支援hll_set_defaults函數,可以設定精度,樣本如下:

    SELECT hll_set_defaults(15,5,-1,1);

    返回結果如下:

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

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

    返回結果如下:

                                      hll_print                                  
    -----------------------------------------------------------------------------
     EXPLICIT, 1 elements, nregs=32768, nbits=5, expthresh=-1(2560), sparseon=1:+
     0:                    1 
    (1 row)

卸載hll外掛程式

DROP EXTENSION hll;

樣本

  1. 準備基礎資料。

    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);
  2. 執行如下查詢。

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