HLL
HLL
概要
HLLはHyperLogLogアルゴリズムに基づいたプログラムの開発を可能にします。HLLは、HyperLogLog計算プロセスの中間結果を格納するために使用されます。これはテーブルの値カラム型としてのみ使用できます。集約によってデータ量を削減し、クエリ処理の高速化を図ります。推定結果には1%の偏差が生じる可能性があります。
HLLカラムはインポートされたデータまたは他のカラムのデータに基づいて生成されます。データがインポートされるとき、hll_hash関数はどのカラムをHLLカラムの生成元として使用するかを指定します。HLLは、COUNT DISTINCTを置き換えて独自ビュー(UV)を素早く計算するためによく使用されます。
関連する関数:
HLL_UNION_AGG(hll): この関数は、条件を満たすすべてのデータの基数を推定するための集約関数です。これは関数の解析にも使用できます。デフォルトウィンドウのみをサポートし、window句はサポートしません。
HLL_RAW_AGG(hll): この関数は、hll型のフィールドを集約し、hll型で返すための集約関数です。
HLL_CARDINALITY(hll): この関数は、単一のhllカラムの基数を推定するために使用されます。
HLL_HASH(column_name): これはHLLカラム型を生成し、挿入またはインポートに使用されます。インポートの使用方法については、説明書を参照してください。
HLL_EMPTY: これは空のHLLカラムを生成し、挿入またはインポート時のデフォルト値の埋め込みに使用されます。インポートの使用方法については、説明書を参照してください。
例
-
まず、HLLカラムを持つテーブルを作成します。
create table test(
dt date,
id int,
name char(10),
province char(10),
os char(1),
set1 hll hll_union,
set2 hll hll_union)
distributed by hash(id); -
データをインポートします。インポート方法については、Stream Loadを参照してください。
a. テーブルカラムを使用してHLLカラムを生成する
curl --location-trusted -uname:password -T data -H "label:load_1" \
-H "columns:dt, id, name, province, os, set1=hll_hash(id), set2=hll_hash(name)"
http://host/api/test_db/test/_stream_load
b. データカラムを使用してHLLカラムを生成する
curl --location-trusted -uname:password -T data -H "label:load_1" \
-H "columns:dt, id, name, province, sex, cuid, os, set1=hll_hash(cuid), set2=hll_hash(os)"
http://host/api/test_db/test/_stream_load -
以下の3つの方法でデータを集計します:(集計しない場合、ベーステーブルの直接クエリはapprox_count_distinctを使用した場合と同様に遅くなる可能性があります)
a. ロールアップを作成してHLLカラムを集計する
alter table test add rollup test_rollup(dt, set1);
b. uvを計算する別のテーブルを作成し、データを挿入する
create table test_uv(
dt date,
id int
uv_set hll hll_union)
distributed by hash(id);
insert into test_uv select dt, id, set1 from test;
c. uvを計算する別のテーブルを作成し、他のカラムをテストしてHLLハッシュを通じてデータを挿入およびHLLカラムを生成する
create table test_uv(
dt date,
id int,
id_set hll hll_union)
distributed by hash(id);
insert into test_uv select dt, id, hll_hash(id) from test; -
クエリを実行します。HLLカラムは元の値での直接クエリをサポートしていません。関数の一致によってクエリすることができます。
a. 総uvを計算する
select HLL_UNION_AGG(uv_set) from test_uv;
b. 各日のuvを計算する
select dt, HLL_CARDINALITY(uv_set) from test_uv;
c. テストテーブルのset1の集計値を計算する
select dt, HLL_CARDINALITY(uv) from (select dt, HLL_RAW_AGG(set1) as uv from test group by dt) tmp;
select dt, HLL_UNION_AGG(set1) as uv from test group by dt;