メインコンテンツまでスキップ

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カラムを生成し、挿入またはインポート時のデフォルト値の埋め込みに使用されます。インポートの使用方法については、説明書を参照してください。

  1. まず、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);
  2. データをインポートします。インポート方法については、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. 以下の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;
  4. クエリを実行します。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;