このトピックでは、ApsaraDB for SelectDB が提供するビットマップベースの重複除外機能について説明します。この機能を使用すると、データの重複除外を実行し、クエリを高速化できます。
概要
ApsaraDB for SelectDB は、ビットマップデータ型をサポートしています。集約キーモデルでは、ビットマップ型の値フィールドをコレクションの積集合および和集合集約関数と共に使用して、正確なデータ重複除外を実行できます。
従来のデータウェアハウスにおけるビットマップベースの重複除外機能は、数億以上の要素を持つビットマップの積集合と和集合を処理する場合、パフォーマンスが低下します。これは、次の理由によります。まず、ビットマップのサイズが非常に大きい場合(1 GBを超える場合)、ネットワークとディスク I/O の処理時間が大幅に長くなります。次に、クラスターでのデータスキャンが完了すると、すべてのデータが単一の最上位ノードに送信されて和集合計算が実行されるため、そのノードにかなりの負荷がかかります。
ApsaraDB for SelectDB は、分散環境向けに最適化されています。つまり、ハッシュアルゴリズムを使用して、ビットマップ列の値をバケットごとに分割できます。このようにして、異なる値が異なるバケットに格納されます。これにより、異なるバケット内のビットマップ値が直交するため、カーディナリティが大幅に減少します。クエリの際は、まず異なるバケット内の直交ビットマップが集約および計算され、次に最上位ノードが集約計算値を結合して出力します。これにより、計算効率が大幅に向上し、最上位レベルでの単一ノード計算によるボトルネックが解消されます。
例
集約キーモデルを使用し、値フィールドがビットマップデータ型であるテーブルを作成します。bitmap_union などの積集合または和集合関数を集約関数として使用します。hid 列は、バケット ID を示すために作成されます。次のコードは例を示しています。
説明hid 列とバケットの数を適切に設定します。ハッシュバケット化後のデータのバランスの取れた分散を確保するには、hid 列のカーディナリティがバケット数の少なくとも 5 倍である必要があります。
CREATE TABLE `user_tag_Bitmap` ( `tag` bigint(20) NULL COMMENT "ユーザータグ", `hid` smallint(6) NULL COMMENT "バケット ID", `user_id` Bitmap Bitmap_UNION NULL COMMENT "" ) ENGINE=OLAP AGGREGATE KEY(`tag`, `hid`) COMMENT "OLAP" DISTRIBUTED BY HASH(`hid`) BUCKETS 3hid 列は、user_id 列の値の範囲をハッシュバケット列として示すために、テーブルスキーマに追加されます。
データをインポートします。
LOAD LABEL user_tag_Bitmap_test ( DATA INFILE('hdfs://abc') INTO TABLE user_tag_Bitmap COLUMNS TERMINATED BY ',' (tmp_tag, tmp_user_id) SET ( tag = tmp_tag, hid = ceil(tmp_user_id/500), user_id = to_Bitmap(tmp_user_id) ) ) # 注: 数字 500 は固定ではありません。ビジネス要件に基づいて数字を調整できます。インポートされたデータは次の形式です。2 つの列は、タグとユーザー ID を指定します。
11111111,1 11111112,2 11111113,3 11111114,4 ...データのインポート中に、ApsaraDB for SelectDB は user_id 列のビットマップ値の範囲をカットします。たとえば、[1,5000000) の範囲のユーザー ID の HID 値は同じであり、同じ HID 値を持つ行はバケットに割り当てられます。このようにして、各バケットのビットマップ値は直交します。バケット間のビットマップ値の直交機能を使用できるため、コレクションの積集合と和集合の計算リソースの使用量が大幅に削減されます。
データのインポート後、ビットマップ関数を呼び出して、ビットマップ関連の操作を実行できます。呼び出すことができるビットマップ関数の詳細については、SQL リファレンスの「ビットマップ関数」セクションを参照してください。
直交ビットマップ関数
直交シナリオでのビットマップクエリには、Bitmap_orthogonal_intersect、orthogonal_Bitmap_intersect_count、orthogonal_Bitmap_union_count、orthogonal_Bitmap_expr_calculate、orthogonal_Bitmap_expr_calculate_count の関数が使用できます。次のセクションでは、上記の関数について説明します。
直交ビットマップ関数は、パーティションテーブルでは使用できません。パーティションテーブルのパーティションは直交しているため、パーティション間のデータが直交していることは保証できません。その結果、計算結果を推定できません。
Bitmap_orthogonal_intersect
ビットマップの積集合を計算します。
構文
orthogonal_Bitmap_intersect(Bitmap_column, column_to_filter, filter_values)パラメーター
パラメーター | 説明 |
Bitmap_column | ビットマップ列の名前。 |
column_to_filter | フィルタリングに使用されるディメンション列の名前。 |
filter_values | 指定されたディメンション列をフィルタリングするために使用される可変長値リスト。 |
例
SELECT Bitmap_COUNT(orthogonal_Bitmap_intersect(user_id, tag, 13080800, 11110200)) FROM user_tag_Bitmap WHERE tag IN (13080800, 11110200);クエリの実行中、集約は 2 つのステージで実行されます。最初のステージでは、ApsaraDB for SelectDB は filter_values に基づいてタグをフィルタリングし、次にすべての集約タグのビットマップ値の積集合を計算します。2 番目のステージでは、ApsaraDB for SelectDB は最初のステージから取得したすべてのビットマップ値の和集合を反復的に計算します。
orthogonal_Bitmap_intersect_count
ビットマップの共通部分を計算し、共通部分の結果をカウントします。intersect_count と同じ構文ですが、実装は異なります。
構文
orthogonal_Bitmap_intersect_count(Bitmap_column, column_to_filter, filter_values)パラメーター
パラメーター | 説明 |
Bitmap_column | ビットマップ列の名前。 |
column_to_filter | フィルタリングに使用されるディメンション列の名前。 |
filter_values | 指定されたディメンション列をフィルタリングするために使用される可変長値リスト。 |
例
SELECT orthogonal_Bitmap_intersect_count(user_id, tag, 1150000, 1150001, 390006) FROM user_tag_Bitmap WHERE tag IN (1150000, 1150001, 390006);クエリの実行中、集約は 2 つのステージで実行されます。最初のステージでは、ApsaraDB for SelectDB は filter_values に基づいてタグをフィルタリングし、次にすべての集約タグのビットマップ値の積集合を計算し、最後に積集合の結果をカウントします。2 番目のステージでは、ApsaraDB for SelectDB は最初のステージから取得したすべてのカウント値の合計を反復的に計算します。
orthogonal_Bitmap_union_count
ビットマップ値の和集合を計算し、和集合の結果をカウントします。Bitmap_union_count の構文と同じですが、実装は異なります。
構文
orthogonal_Bitmap_union_count(Bitmap_column)パラメーター
パラメーター | 説明 |
Bitmap_column | カウントのために値の和集合を計算するビットマップ列の名前。 |
例
SELECT orthogonal_Bitmap_union_count(user_id) FROM user_tag_Bitmap WHERE tag IN (1150000, 1150001, 390006);クエリの実行中、集約は 2 つのステージで実行されます。最初のステージでは、ApsaraDB for SelectDB はビットマップ値の和集合を計算し、次に和集合の結果をカウントします。2 番目のステージでは、ApsaraDB for SelectDB は最初のステージから取得したすべてのカウント値の合計を反復的に計算します。
orthogonal_Bitmap_expr_calculate
式を使用して、ビットマップの積集合、和集合、および差集合を計算します。
構文
orthogonal_Bitmap_expr_calculate(Bitmap_column, filter_column, input_string)パラメーター
パラメーター | 説明 |
Bitmap_column | カウントのために値の和集合を計算するビットマップ列の名前。 |
filter_column | フィルタリングに使用されるディメンション列、つまり計算のキー列。 |
input_string | キー列に基づいてビットマップの積集合、和集合、および差集合を計算するための式文字列。 式では次の演算子がサポートされています。
|
例
SELECT orthogonal_Bitmap_expr_calculate(user_id, tag, '(833736|999777)&(1308083|231207)&(1000|20000-30000)') FROM user_tag_Bitmap WHERE tag IN (833736,999777,130808,231207,1000,20000,30000);クエリの実行中、集約は 2 つのステージで実行されます。最初のステージでは、ApsaraDB for SelectDB は input_string を解析してタグフィルタ条件を取得し、次にデータをフィルタリングし、最後に input_string に基づいてフィルタリングされたデータに対してビットマップ計算を実行します。2 番目のステージでは、ApsaraDB for SelectDB は最初のステージから取得したすべてのビットマップ値の和集合を計算し、最終的なビットマップ結果を返します。
orthogonal_Bitmap_expr_calculate_count
式を使用してビットマップの積集合、和集合、および差集合を計算し、計算結果をカウントします。構文とパラメーターは、orthogonal_Bitmap_expr_calculate と同じです。
構文
orthogonal_Bitmap_expr_calculate_count(Bitmap_column, filter_column, input_string)パラメーター
パラメーター | 説明 |
Bitmap_column | カウントのために値の和集合を計算するビットマップ列の名前。 |
filter_column | フィルタリングに使用されるディメンション列、つまり計算のキー列。 |
input_string | キー列に基づいてビットマップの積集合、和集合、および差集合を計算するための式文字列。 式では次の演算子がサポートされています。
|
例
SELECT orthogonal_Bitmap_expr_calculate_count(user_id, tag, '(833736|999777)&(1308083|231207)&(1000|20000-30000)') FROM user_tag_Bitmap WHERE tag IN (833736,999777,130808,231207,1000,20000,30000);クエリの実行中、集約は 2 つのステージで実行されます。最初のステージでは、ApsaraDB for SelectDB は input_string を解析してタグフィルタ条件を取得し、次にデータをフィルタリングし、input_string に基づいてフィルタリングされたデータに対してビットマップ計算を実行し、最後に計算結果をカウントします。2 番目のステージでは、ApsaraDB for SelectDB は最初のステージから取得したすべてのビットマップ値の和集合を計算し、最終的なビットマップ結果を返します。