このトピックでは、hll拡張機能を使用してページビュー (PV) とユニークビジター (UV) を推定する方法について説明します。 このトピックでは、拡張機能でサポートされているHyperLogLogデータ型についても説明します。
前提条件
RDSインスタンスのメジャーエンジンバージョンは、拡張機能でサポートされています。 詳細については、「ApsaraDB RDS For PostgreSQLでサポートされている拡張機能」をご参照ください。
RDSインスタンスのメジャーエンジンバージョンが要件を満たしているが、拡張機能がまだサポートされていない場合、RDSインスタンスのマイナーエンジンバージョンが更新されます。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
背景情報
hll拡張は、拡張可能なセットに似たデータ型HyperLogLog (hll) をサポートして、指定された精度でDISTINCT要素を推定します。 たとえば、1,280バイトのhllデータを使用して、数十億個のDISTINCT要素を正確に推定できます。 hll拡張は、PVおよびUVを推定するためのインターネット広告分析などの推定分析が必要な業界に適しています。
hll拡張機能の使用方法の詳細については、postgresql-hllをご参照ください。
詳細なアルゴリズムの詳細については、HyperLogLog: 最適に近いカーディナリティ推定アルゴリズムの分析をご覧ください。
hll拡張子の作成
インスタンスに接続した後、次のステートメントを実行してhllエクステンションを作成します。
拡張hllを作成します。
基本操作
次のステートメントを実行して、hllフィールドを含むテーブルを作成します。
テーブルagg (id intプライマリキー、userids hll) を作成します。
次の文を実行して、INTデータをhll_hashvalデータに変換します。
選択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); # hll_add_agg(1::hll_hashval);
hll_hashvalデータ型は、次の演算子をサポートします。
=
!=
<>
例:
select 1::hll_hashval = 2::hll_hashval; select 1::hll_hashval <> 2::hll_hashval;
基本機能
hll拡張は、hll_hash_boolean、hll_hash_smallint、hll_hash_bigintなどのハッシュ関数をサポートします。 例:
hll_hash_boolean(true) を選択します。hll_hash_integer(1) を選択します。
hll拡張機能は、データ型をINTからhllに変換するhll_add_agg関数をサポートしています。 例:
hll_add_agg(1::hll_hashval) を選択します。
hll拡張は、hll_union関数をサポートして、hllデータに対してUNION操作を実行します。 例:
hll_union(hll_add_agg(1::hll_hashval) 、hll_add_agg(2::hll_hashval)) を選択します。
hll拡張は、精度を設定するためのhll_set_defaults関数をサポートしています。 例:
hll_set_defaults(15,5、-1,1) を選択します。
hll拡張機能は、デバッグ情報を表示するhll_print機能をサポートしています。 例:
hll_print(hll_add_agg(1::hll_hashval)) を選択します。
サンプルコマンド
テーブルaccess_date (acc_date unique, userids hll) を作成します。select current_date, hll_add_agg(hll_hash_integer(user_id)) from generate_series(1,10000) t(user_id);
access_date選択current_date-1に挿入、hll_add_agg(hll_hash_integer(user_id)) from generate_series(5000,20000) t(user_id);
access_date選択current_date-2に挿入、hll_add_agg(hll_hash_integer(user_id)) from generate_series(9000,40000) t(user_id);
postgres=# select #userids from access_date (acc_date=current_date);
? コラム?
------------------
9725.85273370708
(1行)
postgres=# select #userids from access_date (acc_date=current_date-1);
? コラム?
------------------
14968.6596883279
(1行)
postgres=# select #userids from access_date (acc_date=current_date-2);
? コラム?
------------------
29361.5209149911
(1行) この機能は、PostgreSQL 11以降を実行するRDSインスタンスでサポートされています。 この機能がサポートされていない場合は、RDSインスタンスのマイナーエンジンバージョンを更新します。 詳細については、「マイナーエンジンバージョンのアップグレード」をご参照ください。