Use Bitmap for exact count distinct
ビットマップを使用した正確な重複カウントのための使用方法
このトピックでは、StarRocksでビットマップを使用して一意の値の数を計算する方法について説明します。
ビットマップは、配列内の一意の値の数を計算するための便利なツールです。この方法は、従来の重複カウントと比較して、より少ないストレージスペースを使用し、計算を高速化することができます。[0、n)の値範囲を持つ配列Aがあると仮定します。 (n+7)/8バイトのビットマップを使用すると、配列内の一意の要素の数を計算できます。これには、すべてのビットを0に初期化し、要素の値をビットの添字として設定し、すべてのビットを1に設定します。ビットマップ内の1の数は、配列内の一意の要素の数です。
従来の重複カウント
StarRocksは、重複カウントを使用する際に詳細なデータを保持することができるMPPアーキテクチャを使用しています。ただし、重複カウント機能はクエリ処理中に複数のデータシャッフルが必要であり、データの量が増加するにつれてパフォーマンスが線形に低下します。
以下のシナリオでは、テーブル(dt、page、user_id)内の詳細データに基づいてUV(Unique Visitors)を計算します。
dt | page | user_id |
---|---|---|
20191206 | game | 101 |
20191206 | shopping | 102 |
20191206 | game | 101 |
20191206 | shopping | 101 |
20191206 | game | 101 |
20191206 | shopping | 101 |
StarRocksは、次の図に示すようにデータを計算します。まず、データをpage
とuser_id
の列でグループ化し、その後に処理結果をカウントします。
- 注: この図は、2つのBEノードで計算された6行のデータの概略図です。
複数のシャッフル操作を必要とする大量のデータを処理する場合、必要な計算リソースが大幅に増加することがあります。これにより、クエリが遅くなります。ただし、ビットマップテクノロジーを使用すると、この問題を解決し、このようなシナリオでクエリのパフォーマンスを向上させることができます。
page
ごとにUV(Unique Visitors)をカウントする場合:
select page, count(distinct user_id) as uv from table group by page;
| page | uv |
| :---: | :---: |
| game | 1 |
| shopping | 2 |