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

bitmap

ビットマップ

ビットマップにおけるいくつかの集計関数の使用法を説明するためのシンプルな例を示します。関数の詳細な定義やその他のビットマップ関数については、bitmap-functions を参照してください。

テーブルの作成

テーブルを作成する際には集計モデルが必要です。データ型はビットマップで、集計関数は bitmap_union です。

CREATE TABLE `pv_bitmap` (
`dt` int(11) NULL COMMENT "",
`page` varchar(10) NULL COMMENT "",
`user_id` bitmap BITMAP_UNION NULL COMMENT ""
) ENGINE=OLAP
AGGREGATE KEY(`dt`, `page`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`dt`);

注: データ量が増えた場合、高頻度の bitmap_union に対応するロールアップテーブルを作成することをおすすめします。

ALTER TABLE pv_bitmap ADD ROLLUP pv (page, user_id);

データのロード

TO_BITMAP (expr): 0 〜 18446744073709551615 の範囲の unsigned bigint をビットマップに変換します。

BITMAP_EMPTY (): 空のビットマップ列を生成し、挿入または入力時にデフォルト値を入力します。

BITMAP_HASH (expr): 任意の型の列をハッシュ化してビットマップに変換します。

ストリームロード

ストリームロードを使用してデータを入力する際、次のようにデータをビットマップフィールドに変換することができます。

cat data | curl --location-trusted -u user:passwd -T - \
-H "columns: dt,page,user_id, user_id=to_bitmap(user_id)" \
http://host:8410/api/test/testDb/_stream_load
cat data | curl --location-trusted -u user:passwd -T - \
-H "columns: dt,page,user_id, user_id=bitmap_hash(user_id)" \
http://host:8410/api/test/testDb/_stream_load
cat data | curl --location-trusted -u user:passwd -T - \
-H "columns: dt,page,user_id, user_id=bitmap_empty()" \
http://host:8410/api/test/testDb/_stream_load

Insert Into

Insert Into を使用してデータを入力する場合、ソーステーブルの列の型に基づいて対応するモードを選択する必要があります。

  • ソーステーブルの id2 の列の型はビットマップです。
insert into bitmap_table1
select id, id2 from bitmap_table2;
  • ターゲットテーブルの id2 の列の型はビットマップです。
insert into bitmap_table1 (id, id2)
values (1001, to_bitmap(1000))
, (1001, to_bitmap(2000));
  • ソーステーブルの id2 の列の型はビットマップであり、bit_map_union() を使用して集計された結果です。
insert into bitmap_table1
select id, bitmap_union(id2) from bitmap_table2 group by id;
  • ソーステーブルの id2 の列の型は INT であり、ビットマップタイプは to_bitmap() によって生成されます。
insert into bitmap_table1
select id, to_bitmap(id2) from table;
  • ソーステーブルの id2 の列の型は STRING であり、ビットマップタイプは bitmap_hash() によって生成されます。
insert into bitmap_table1
select id, bitmap_hash(id2) from table;

データのクエリ

構文

BITMAP_UNION (expr): 入力ビットマップの和集合を計算し、新しいビットマップを返します。

BITMAP_UNION_COUNT (expr): 入力ビットマップの和集合を計算し、そのカーディナリティを返します。BITMAP_COUNT (BITMAP_UNION (expr)) と同じです。BITMAP_COUNT (BITMAP_UNION (expr)) よりも BITMAP_UNION_COUNT 関数の方がパフォーマンスが良いため、BITMAP_UNION_COUNT 関数を使用することをおすすめします。

BITMAP_UNION_INT (expr): TINYINT、SMALLINT、INT 型の列の異なる値の数を計算し、COUNT (DISTINCT expr) と同じ値を返します。

INTERSECT_COUNT (bitmap_column_to_count, filter_column, filter_values ...): filter_column の条件を満たす複数のビットマップの積集合のカーディナリティを計算します。bitmap_column_to_count はビットマップ型の列であり、filter_column は可変次元の列です。filter_values は次元の値のリストです。

BITMAP_INTERSECT(expr): このグループのビットマップ値の積集合を計算し、新しいビットマップを返します。

以下のSQLは、上記の pv_bitmap テーブルを使用した例です:

user_id のユニークな値を計算する:

select bitmap_union_count(user_id)
from pv_bitmap;

select bitmap_count(bitmap_union(user_id))
from pv_bitmap;

id のユニークな値を計算する:

select bitmap_union_int(id)
from pv_bitmap;

user_id のリテンションを計算する:

select intersect_count(user_id, page, 'game') as game_uv,
intersect_count(user_id, page, 'shopping') as shopping_uv,
intersect_count(user_id, page, 'game', 'shopping') as retention -- 'game' と 'shopping' の両方にアクセスするユーザーの数
from pv_bitmap
where page in ('game', 'shopping');

キーワード

BITMAP,BITMAP_COUNT,BITMAP_EMPTY,BITMAP_UNION,BITMAP_UNION_INT,TO_BITMAP,BITMAP_UNION_COUNT,INTERSECT_COUNT,BITMAP_INTERSECT