StarRocks は、Flink から StarRocks のテーブルにデータをインポートするための Apache Flink コネクタ (以下「Flink コネクタ」) を提供します。StarRocks Flink コネクタは、Flink 組み込みの flink-connector-jdbc よりもパフォーマンスと安定性に優れており、大規模なデータインポートシナリオに最適です。
背景情報
StarRocks Flink コネクタは、データのミニバッチをインメモリにキャッシュし、StarRocks の Stream Load 機能を使用してバッチインポートを実行します。DataStream API、Table API & SQL、および Python API をサポートしており、データインポートの効率が大幅に向上します。
前提条件
-
Flink サービスが有効になっているクラスターを作成しておく必要があります。
このトピックでは、EMR on ECS 上で Flink サービスを有効にして作成した DataFlow クラスターを例として使用します。以降、これを Flink クラスターと呼びます。詳細については、「Create a cluster」をご参照ください。
-
EMR Serverless StarRocks インスタンスを作成しておく必要があります。詳細については、「Create an instance」をご参照ください。
制限
-
Flink を実行するマシンから、StarRocks インスタンス内の FE ノードの http_port (デフォルト:
8030) と query_port (デフォルト:9030)、および BE ノードの be_http_port (デフォルト:8040) にアクセスできることを確認してください。 -
Flink コネクタを使用して StarRocks にデータをインポートするには、ターゲットテーブルに対する
SELECTおよびINSERT権限が必要です。 -
Flink コネクタと、Java、Scala、および Flink のバージョンには、次の互換性要件があります。
コネクタ
Flink
StarRocks
Java
Scala
1.2.9
1.15–1.18
2.1 以降
8
2.11、2.12
1.2.8
1.13–1.17
2.1 以降
8
2.11、2.12
1.2.7
1.11–1.15
2.1 以降
8
2.11、2.12
設定
このセクションでは、StarRocks のパラメーター設定とデータ型マッピングについて説明します。詳細については、「Continuously load data from Apache Flink® | StarRocks」をご参照ください。
パラメーターの説明
|
パラメーター |
必須 |
デフォルト値 |
説明 |
|
|
はい |
NONE |
コネクタを StarRocks として指定します。このパラメーターを |
|
|
はい |
NONE |
StarRocks でクエリを実行するために使用します。 例: jdbc:mysql://fe-c-9b354c83e891-internal.starrocks.aliyuncs.com:9030。 ここで、 注意 EMR Serverless StarRocks インスタンス内の FE ノードのプライベートネットワークアドレスを取得する方法については、「インスタンスリストと詳細の表示」をご参照ください。 |
|
|
はい |
NONE |
FE ノードのプライベートネットワークアドレスと HTTP ポートを 例: |
|
|
はい |
NONE |
StarRocks データベースの名前。 |
|
|
はい |
NONE |
StarRocks テーブルの名前。 |
|
|
はい |
NONE |
StarRocks インスタンスのユーザー名。例えば、デフォルトのユーザー名は admin です。 Flink コネクタを使用して StarRocks にデータをインポートするには、ターゲットテーブルに対する SELECT および INSERT 権限が必要です。ユーザーアカウントにこれらの権限がない場合は、まず権限を付与してください。詳細については、「ユーザー管理とデータ認可」をご参照ください。 |
|
|
はい |
NONE |
StarRocks インスタンスのパスワード。 |
|
|
いいえ |
at-least-once |
ターゲットシステムへのデータ書き込み時の信頼性と一貫性を保証するため、シンクのセマンティクス保証レベルを定義します。有効な値:
|
|
|
いいえ |
AUTO |
データインポートインターフェイスを指定します。このパラメーターは Flink コネクタ 1.2.4 以降でサポートされています。
|
|
|
いいえ |
NONE |
Stream Load のラベルプレフィックスを指定します。Flink コネクタ 1.2.8 以降を使用し、exactly-once セマンティクスが必要な場合は、ラベルプレフィックスを設定することを推奨します。 |
|
|
いいえ |
94371840 (90 MB) |
Stream Load を介して StarRocks に 1 バッチでインポートされる前に、メモリにバッファリングされるデータの最大サイズ。値を大きくするとインポートパフォーマンスが向上しますが、インポートレイテンシが増加する可能性があります。 有効範囲: [64 MB、10 GB]。 説明
|
|
|
いいえ |
500000 |
Stream Load を介して StarRocks に 1 バッチでインポートされる前に、メモリにバッファリングされる行の最大数。 有効範囲: [64000、5000000]。 説明
このパラメーターは、 |
|
|
いいえ |
300000 |
データ送信の間隔 (ミリ秒単位)。StarRocks へのデータ書き込みのレイテンシを制御します。 有効範囲: [1000、3600000]。 説明
このパラメーターは、 |
|
|
いいえ |
3 |
Stream Load 失敗後の最大再試行回数。この制限を超えると、データインポートタスクは失敗します。 有効範囲: [0、10]。 説明
このパラメーターは、 |
|
|
いいえ |
30000 |
FE ノードとの HTTP 接続を確立するためのタイムアウト (ミリ秒単位)。 有効範囲: [100、60000]。 Flink Connector 1.2.9 より前のバージョンでは、デフォルト値は |
|
|
いいえ |
-1 |
Flink Connector 1.2.10 以降でサポートされています。HTTP クライアントがデータを待機するためのタイムアウト (ミリ秒) で、デフォルト値の |
|
|
いいえ |
10000 |
Flink コネクタ 1.2.7 以降でサポートされています。FE HTTP 100-continue レスポンスを待機するためのタイムアウト (ミリ秒単位) です。 有効範囲: [3000、60000]。 |
|
|
いいえ |
TRUE |
Flink コネクタ 1.2.8 以降でサポートされています。プライマリキーテーブルにデータをインポートする際、Flink からの UPDATE_BEFORE レコードを無視するかどうかを指定します。false に設定すると、このようなレコードはプライマリキーテーブルで DELETE 操作として扱われます。 |
|
|
いいえ |
NONE |
書き込みの並列度。Flink SQL にのみ適用されます。設定されていない場合、Flink プランナーが並列度を決定します。複数並列のシナリオでは、データが正しい順序で書き込まれるようにしてください。 |
|
sink.properties.* |
いいえ |
NONE |
インポート動作を制御する Stream Load のパラメーター。 |
|
sink.properties.format |
いいえ |
csv |
Stream Load インポートのデータフォーマット。Flink コネクタは、Stream Load を介して StarRocks にインポートする前に、メモリ内のデータを指定されたフォーマットに変換します。有効な値: CSV または JSON。 |
|
sink.properties.column_separator |
いいえ |
\t |
CSV データの列区切り記号。 |
|
sink.properties.row_delimiter |
いいえ |
\n |
CSV データの行区切り記号。 |
|
sink.properties.max_filter_ratio |
いいえ |
0 |
インポートジョブの最大エラー許容率。これは、データ品質の問題によりフィルタリングできるデータ行の最大割合です。 有効範囲: 0–1。 |
|
sink.properties.partial_update |
いいえ |
false |
部分更新を有効にするかどうかを指定します。有効な値: |
|
sink.properties.partial_update_mode |
いいえ |
row |
部分更新モードを指定します。有効な値:
|
|
sink.properties.strict_mode |
いいえ |
false |
Stream Load の厳格モードを有効にするかどうかを指定します。厳格モードは、無効な行 (列値が一致しない行など) が検出されたときのインポート動作に影響します。 有効な値は |
|
sink.properties.compression |
いいえ |
NONE |
Flink コネクタ 1.2.10 以降でサポートされています。Stream Load の圧縮アルゴリズムを指定します。現在、JSON フォーマットのみが圧縮をサポートしています。 有効な値: 説明
StarRocks 3.2.7 以降のみが JSON 圧縮をサポートしています。 |
データ型マッピング
|
Flink データ型 |
StarRocks データ型 |
|
BOOLEAN |
BOOLEAN |
|
TINYINT |
TINYINT |
|
SMALLINT |
SMALLINT |
|
INTEGER |
INTEGER |
|
BIGINT |
BIGINT |
|
FLOAT |
FLOAT |
|
DOUBLE |
DOUBLE |
|
DECIMAL |
DECIMAL |
|
BINARY |
INT |
|
CHAR |
STRING |
|
VARCHAR |
STRING |
|
STRING |
STRING |
|
DATE |
DATE |
|
TIMESTAMP_WITHOUT_TIME_ZONE(N) |
DATETIME |
|
TIMESTAMP_WITH_LOCAL_TIME_ZONE(N) |
DATETIME |
|
ARRAY<T> |
ARRAY<T> |
|
MAP<KT,VT> |
JSON STRING |
|
ROW<arg T...> |
JSON STRING |
事前準備
Flink コネクタ JAR ファイルの取得と Flink クラスターへのアップロード
-
Flink コネクタ JAR ファイルは、次のいずれかの方法で取得できます:
方法 1:直接ダウンロード
Maven 中央リポジトリ から、さまざまなバージョンの Flink コネクタ JAR ファイルをダウンロードできます。
方法 2:Maven 依存関係
次の形式で、Maven プロジェクトの
pom.xmlファイルに Flink コネクタを依存関係として追加します:-
Flink 1.15 以降と互換性のある Flink コネクタの場合:
<dependency> <groupId>com.starrocks</groupId> <artifactId>flink-connector-starrocks</artifactId> <version>${connector_version}_flink-${flink_version}</version> </dependency> -
1.15 より前の Flink バージョンと互換性のある Flink コネクタの場合:
<dependency> <groupId>com.starrocks</groupId> <artifactId>flink-connector-starrocks</artifactId> <version>${connector_version}_flink-${flink_version}_${scala_version}</version> </dependency>
方法 3:手動コンパイル
-
Flink コネクタのソースコード をダウンロードします。
-
次のコマンドを実行して、Flink コネクタのソースコードを JAR ファイルにコンパイルします:
sh build.sh <flink_version>たとえば、Flink バージョンが 1.17 の場合は、次のコマンドを実行します:
sh build.sh 1.17 -
コンパイル後、生成された JAR ファイルは
target/ディレクトリにあります。たとえば、ファイル名は通常
flink-connector-starrocks-1.2.7_flink-1.17-SNAPSHOT.jarのような形式です。説明未リリースの Flink コネクタのバージョンには、
SNAPSHOTサフィックスが含まれます。
Flink コネクタ JAR ファイル名は、次の形式です:
-
Flink 1.15 以降の場合:
flink-connector-starrocks-${connector_version}_flink-${flink_version}.jar。 たとえば、Flink 1.17 と Flink コネクタ 1.2.8 を使用する場合、ファイル名はflink-connector-starrocks-1.2.8_flink-1.17.jarです。 -
1.15 より前の Flink バージョンの場合:
flink-connector-starrocks-${connector_version}_flink-${flink_version}_${scala_version}.jar。 たとえば、Flink 1.14、Scala 2.12、Flink コネクタ 1.2.7 を使用する場合、ファイル名はflink-connector-starrocks-1.2.7_flink-1.14_2.12.jarです。説明必要に応じて、次のプレースホルダーを置き換えてください:
-
flink_version:お使いの Flink のバージョン番号。 -
scala_version:お使いの Scala のバージョン番号。 -
connector_version:お使いの Flink コネクタのバージョン番号。
-
-
-
取得した Flink コネクタ JAR ファイルを、お使いの Flink クラスターの
flink-{flink_version}/libディレクトリにアップロードします。たとえば、バージョン EMR-5.19.0 の EMR クラスターを使用する場合、JAR ファイルを
/opt/apps/FLINK/flink-current/libディレクトリに配置します。
Flink クラスターの起動
-
お使いの Flink クラスターのマスターノードにログインします。 詳細については、「クラスターへのログイン」をご参照ください。
-
次のコマンドを実行して Flink クラスターを起動します:
/opt/apps/FLINK/flink-current/bin/start-cluster.sh
例
Flink SQL を使用したデータの書き込み
-
StarRocks に
testという名前のデータベースを作成し、次にそのデータベースにscore_boardという名前のプライマリキーテーブルを作成します。CREATE DATABASE test; CREATE TABLE test.score_board( id int(11) NOT NULL COMMENT "", name varchar(65533) NULL DEFAULT "" COMMENT "", score int(11) NOT NULL DEFAULT "0" COMMENT "" ) ENGINE=OLAP PRIMARY KEY(id) DISTRIBUTED BY HASH(id); -
Flink クラスターのマスターノードにログインします。詳細については、「クラスターへのログイン」をご参照ください。
-
次のコマンドを実行して、Flink SQL を起動します。
/opt/apps/FLINK/flink-current/bin/sql-client.sh -
次のコマンドを実行して、
score_boardという名前のテーブルを作成し、データを挿入します。CREATE TABLE `score_board` ( `id` INT, `name` STRING, `score` INT, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'starrocks', 'jdbc-url' = 'jdbc:mysql://<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:9030', 'load-url' = '<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:8030', 'database-name' = 'test', 'table-name' = 'score_board', 'username' = 'admin', 'password' = '<password>' ); INSERT INTO `score_board` VALUES (1, 'starrocks', 100), (2, 'flink', 100);StarRocks のプライマリキーテーブルにデータをインポートする場合は、Flink テーブル DDL でプライマリキーを明示的に指定する必要があります。Duplicate Key テーブルなど、他のタイプの StarRocks テーブルの場合、プライマリキーの指定は任意です。
Flink DataStream を使用したデータの書き込み
入力レコードのタイプに基づいて、Flink DataStream ジョブを作成します。
-
CSV 形式の文字列データの書き込み
入力レコードが CSV 形式の文字列の場合は、「LoadCsvRecords」で完全な Flink DataStream ジョブコードをご参照ください。
/** * CSV 形式のレコードを生成します。各レコードには "\t" で区切られた 3 つの値があります。 * これらの値は、StarRocks テーブルの `id`、`name`、`score` 列にロードされます。 */ String[] records = new String[]{ "1\tstarrocks-csv\t100", "2\tflink-csv\t100" }; DataStream<String> source = env.fromElements(records); /** * 必要なプロパティを使用して Flink コネクタを設定します。 * また、プロパティ "sink.properties.format" と "sink.properties.column_separator" を追加して、 * 入力レコードが CSV 形式であり、列区切り文字が "\t" であることを Flink コネクタに指定する必要があります。 * CSV 形式のレコードで他の列区切り文字を使用することもできますが、 * その場合は "sink.properties.column_separator" を適宜変更してください。 */ StarRocksSinkOptions options = StarRocksSinkOptions.builder() .withProperty("jdbc-url", jdbcUrl) .withProperty("load-url", loadUrl) .withProperty("database-name", "test") .withProperty("table-name", "score_board") .withProperty("username", "admin") .withProperty("password", "<password>") .withProperty("sink.properties.format", "csv") .withProperty("sink.properties.column_separator", "\t") .build(); // オプションを使用してシンクを作成します。 SinkFunction<String> starRockSink = StarRocksSink.sink(options); source.addSink(starRockSink); -
JSON 形式の文字列データの書き込み
入力レコードが JSON 形式の文字列の場合は、「LoadJsonRecords」で完全な Flink DataStream ジョブコードをご参照ください。
/** * JSON 形式のレコードを生成します。 * 各レコードには、StarRocks テーブルの id、name、score 列に対応する 3 つのキーと値のペアがあります。 */ String[] records = new String[]{ "{\"id\":1, \"name\":\"starrocks-json\", \"score\":100}", "{\"id\":2, \"name\":\"flink-json\", \"score\":100}", }; DataStream<String> source = env.fromElements(records); /** * 必要なプロパティを使用して Flink コネクタを設定します。 * また、プロパティ "sink.properties.format" と "sink.properties.strip_outer_array" を追加して、 * 入力レコードが JSON 形式であり、最も外側の配列構造を削除することを Flink コネクタに指定する必要があります。 */ StarRocksSinkOptions options = StarRocksSinkOptions.builder() .withProperty("jdbc-url", jdbcUrl) .withProperty("load-url", loadUrl) .withProperty("database-name", "test") .withProperty("table-name", "score_board") .withProperty("username", "admin") .withProperty("password", "<password>") .withProperty("sink.properties.format", "json") .withProperty("sink.properties.strip_outer_array", "true") .build(); // オプションを使用してシンクを作成します。 SinkFunction<String> starRockSink = StarRocksSink.sink(options); source.addSink(starRockSink); -
カスタム Java オブジェクトデータの書き込み
入力レコードがカスタム Java オブジェクトの場合は、「LoadCustomJavaRecords」で完全な Flink DataStream ジョブコードをご参照ください。
-
この例では、各レコードを表すために、シンプルな POJO クラス
RowDataが定義されています。public static class RowData { public int id; public String name; public int score; public RowData() {} public RowData(int id, String name, int score) { this.id = id; this.name = name; this.score = score; } } -
メインコードは次のとおりです。
// RowData をコンテナとして使用するレコードを生成します。 RowData[] records = new RowData[]{ new RowData(1, "starrocks-rowdata", 100), new RowData(2, "flink-rowdata", 100), }; DataStream<RowData> source = env.fromElements(records); // 必要なプロパティを使用して Flink コネクタを設定します。 StarRocksSinkOptions options = StarRocksSinkOptions.builder() .withProperty("jdbc-url", jdbcUrl) .withProperty("load-url", loadUrl) .withProperty("database-name", "test") .withProperty("table-name", "score_board") .withProperty("username", "admin") .withProperty("password", "<password>") .build(); /** * Flink コネクタは、StarRocks テーブルにロードされる行を表すために Java オブジェクト配列 (Object[]) を使用します。 * 各要素は列の値です。 * StarRocks テーブルのスキーマと一致する Object[] のスキーマを定義する必要があります。 */ TableSchema schema = TableSchema.builder() .field("id", DataTypes.INT().notNull()) .field("name", DataTypes.STRING()) .field("score", DataTypes.INT()) // StarRocks テーブルがプライマリキーテーブルの場合、プライマリキー `id` に notNull()、例えば DataTypes.INT().notNull() を指定する必要があります。 .primaryKey("id") .build(); // スキーマに従って RowData を Object[] に変換します。 RowDataTransformer transformer = new RowDataTransformer(); // スキーマ、オプション、トランスフォーマーを使用してシンクを作成します。 SinkFunction<RowData> starRockSink = StarRocksSink.sink(schema, options, transformer); source.addSink(starRockSink);RowDataTransformerは次のように定義されています。private static class RowDataTransformer implements StarRocksSinkRowBuilder<RowData> { /** * 入力 RowData に従ってオブジェクト配列の各要素を設定します。 * 配列のスキーマは StarRocks テーブルのスキーマと一致します。 */ @Override public void accept(Object[] internalRow, RowData rowData) { internalRow[0] = rowData.id; internalRow[1] = rowData.name; internalRow[2] = rowData.score; // StarRocks テーブルがプライマリキーテーブルの場合、データロードがアップサートまたは DELETE 操作であるかを示すために、最後の要素を設定する必要があります。 internalRow[internalRow.length - 1] = StarRocksSinkOP.UPSERT.ordinal(); } }
-
Flink CDC 3.0 を使用したデータの同期
Flink CDC 3.0 フレームワークは、MySQL や Kafka などの CDC データソースから StarRocks へのストリーミング ELT パイプラインの構築を簡素化します。このパイプラインを使用すると、次のことが可能になります:
-
データベースとテーブルの自動作成
-
全量データと増分データの同期
-
スキーマ変更の同期
StarRocks Flink コネクタ v1.2.9 以降、このコネクタは Flink CDC 3.0 フレームワークに統合され、StarRocks Pipeline Connector に名前が変更されました。このコネクタは、前述のすべての機能をサポートしています。fast_schema_evolution 機能を活用して列の追加と削除をさらに高速化し、リソース消費を削減するために、StarRocks v3.2.1 以降と併用することを推奨します。
ベストプラクティス
プライマリキーテーブルへのインポート
-
StarRocks に
testという名前のデータベースを作成し、score_boardという名前のプライマリキーテーブルを作成します。CREATE DATABASE `test`; CREATE TABLE `test`.`score_board` ( `id` int(11) NOT NULL COMMENT "", `name` varchar(65533) NULL DEFAULT "" COMMENT "", `score` int(11) NOT NULL DEFAULT "0" COMMENT "" ) ENGINE=OLAP PRIMARY KEY(`id`) COMMENT "OLAP" DISTRIBUTED BY HASH(`id`); -
StarRocks テーブルにデータを挿入します。
INSERT INTO `test`.`score_board` VALUES (1, 'starrocks', 100), (2, 'flink', 100); -
次のコマンドを実行して Flink SQL クライアントを起動します。
/opt/apps/FLINK/flink-current/bin/sql-client.sh -
データを更新します。
部分更新
部分更新では、
scoreなどの他の列に影響を与えることなく、nameなどの特定の列のみを更新できます。-
Flink SQL クライアントで
score_boardテーブルを作成し、部分更新を有効にします。CREATE TABLE `score_board` ( `id` INT, `name` STRING, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'starrocks', 'jdbc-url' = 'jdbc:mysql://<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:9030', 'load-url' = '<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:8030', 'database-name' = 'test', 'table-name' = 'score_board', 'username' = 'admin', 'password' = '<password>', 'sink.properties.partial_update' = 'true', -- Flink コネクタのバージョンが 1.2.7 以下の場合のみ 'sink.properties.columns' = 'id,name,__op' );-
sink.properties.partial_update:部分更新を有効にします。 -
sink.properties.columns:更新する列を指定します。Flink コネクタのバージョンが 1.2.7 以前の場合は、Flink コネクタに更新対象の列を通知するため、sink.properties.columnsオプションもid,name,__opに設定する必要があります。末尾に__opフィールドを追加する必要がある点に注意してください。__opフィールドは、インポートがアップサートまたは削除のどちらであるかを示し、その値は Flink コネクタによって自動的に設定されます。
-
-
更新データを挿入します。
既存データと同じプライマリキーを持ち、
name列の値のみを変更した 2 行を挿入します。INSERT INTO score_board VALUES (1, 'starrocks-update'), (2, 'flink-update'); -
SQL エディターで StarRocks テーブルをクエリします。
SELECT * FROM `test`.`score_board`;name列の値のみが変更され、score列は変更されていないことを確認できます。クエリは、
id=1, name=starrocks-update, score=100とid=2, name=flink-update, score=100の 2 レコードを返します。
条件付き更新
この例では、
score列の値に基づいて条件付き更新を実行する方法を示します。受信データのscoreの値が、StarRocks テーブルの現在の値以上の場合にのみ、行が更新されます。-
Flink SQL クライアントで次のように
score_boardテーブルを作成します。CREATE TABLE `score_board` ( `id` INT, `name` STRING, `score` INT, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'starrocks', 'jdbc-url' = 'jdbc:mysql://<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:9030', 'load-url' = '<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:8030', 'database-name' = 'test', 'table-name' = 'score_board', 'username' = 'admin', 'password' = '<password>', 'sink.properties.merge_condition' = 'score', 'sink.version' = 'V1' );-
sink.properties.merge_condition:scoreに設定します。これにより、Flink コネクタはデータ書き込み時の更新条件としてscore列を使用します。 -
sink.version:V1に設定します。これにより、Flink コネクタはストリームロードインターフェイスを使用してデータをインポートします。
-
-
Flink SQL クライアントで 2 行のデータをテーブルに挿入します。
これらの行は、StarRocks テーブル内の既存の行と同じプライマリキーを持っています。1 行目の
scoreの値は小さく、2 行目のscoreの値は大きいです。INSERT INTO `score_board` VALUES (1, 'starrocks-update', 99), (2, 'flink-update', 101); -
SQL エディターで StarRocks テーブルをクエリします。
SELECT * FROM `test`.`score_board`;2 行目のみが変更され、1 行目は変更されていないことを確認できます。
クエリは、1 行目
id=1, name=starrocks, score=100(変更なし) と、2 行目id=2, name=flink-update, score=101(更新済み) の 2 レコードを返します。
-
ビットマップ列へのインポート
ビットマップデータ型は、ユニークビジター (UV) の算出など、正確な個別カウントのシナリオを高速化するためによく使用されます。次の例では、Flink SQL を使用して StarRocks テーブルのビットマップ列にデータをインポートし、StarRocks で UV 数をクエリする方法を示します。
-
SQL エディターで StarRocks の集計テーブルを作成します。
testデータベースに、次の仕様でpage_uvという名前の集計テーブルを作成します:-
visit_users列を BITMAP 型として定義し、BITMAP_UNION集計関数を設定します。 -
page_idとvisit_dateは、グループ化および重複排除のための集約キー (AGGREGATE KEY) として機能します。
CREATE TABLE `test`.`page_uv` ( `page_id` INT NOT NULL COMMENT 'ページ ID', `visit_date` datetime NOT NULL COMMENT 'アクセス時間', `visit_users` BITMAP BITMAP_UNION NOT NULL COMMENT 'ユーザー ID' ) ENGINE=OLAP AGGREGATE KEY(`page_id`, `visit_date`) DISTRIBUTED BY HASH(`page_id`); -
-
Flink SQL クライアントでテーブルを作成します。
Flink はビットマップ型をサポートしていないため、次のようにカラムマッピングと型変換を実装する必要があります:
-
Flink テーブルでは、StarRocks テーブルの
visit_users列を表すために、visit_user_id列を BIGINT として定義します。 -
sink.properties.columns設定を使用して、visit_user_id列のデータをto_bitmap関数でビットマップ型に変換します。
CREATE TABLE `page_uv` ( `page_id` INT, `visit_date` TIMESTAMP, `visit_user_id` BIGINT ) WITH ( 'connector' = 'starrocks', 'jdbc-url' = 'jdbc:mysql://<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:9030', 'load-url' = '<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:8030', 'database-name' = 'test', 'table-name' = 'page_uv', 'username' = 'admin', 'password' = '<password>', 'sink.properties.columns' = 'page_id,visit_date,visit_user_id,visit_users=to_bitmap(visit_user_id)' ); -
-
Flink SQL クライアントでデータを挿入します。
異なるユーザーが異なる時刻にページにアクセスする状況をシミュレートするため、
page_uvテーブルに複数の行を挿入します。visit_user_idは BIGINT 型です。Flink によってビットマップ型に自動的に変換されます。INSERT INTO `page_uv` VALUES (1, CAST('2020-06-23 01:30:30' AS TIMESTAMP), 13), (1, CAST('2020-06-23 01:30:30' AS TIMESTAMP), 23), (1, CAST('2020-06-23 01:30:30' AS TIMESTAMP), 33), (1, CAST('2020-06-23 02:30:30' AS TIMESTAMP), 13), (2, CAST('2020-06-23 01:30:30' AS TIMESTAMP), 23); -
SQL エディターで UV 数をクエリします。
StarRocks の集約機能を使用し、
COUNT(DISTINCT visit_users)でページごとのユニークビジター (UV) 数を算出します。SELECT page_id, COUNT(DISTINCT visit_users) FROM page_uv GROUP BY page_id;page_idが 2 の場合、count(DISTINCT visit_users)は 1 です。page_idが 1 の場合、count(DISTINCT visit_users)は 3 です。
HyperLogLog (HLL) 列へのインポート
HyperLogLog (HLL) は、近似的な個別カウントに使用されるデータ型であり、大規模データのシナリオでユニークビジター (UV) を算出するのに適しています。次の例では、Flink SQL を使用して StarRocks テーブルの HLL 列にデータをインポートし、StarRocks で UV 数をクエリする方法を示します。
-
SQL エディターで StarRocks の集計テーブルを作成します。
testデータベースに、次の仕様でhll_uvという名前の集計テーブルを作成します:-
visit_users列を HLL 型として定義し、HLL_UNION集計関数を設定します。 -
page_idとvisit_dateは、グループ化および重複排除のための集約キー (AGGREGATE KEY) として機能します。
CREATE TABLE `test`.`hll_uv` ( `page_id` INT NOT NULL COMMENT 'ページ ID', `visit_date` DATETIME NOT NULL COMMENT 'アクセス時間', `visit_users` HLL HLL_UNION NOT NULL COMMENT 'ユーザー ID' ) ENGINE=OLAP AGGREGATE KEY(`page_id`, `visit_date`) DISTRIBUTED BY HASH(`page_id`); -
-
Flink SQL クライアントでテーブルを作成します。
Flink は HLL 型をサポートしていないため、次のようにカラムマッピングと型変換を実装する必要があります:
-
Flink テーブルでは、StarRocks テーブルの
visit_users列を表すために、visit_user_id列を BIGINT として定義します。 -
sink.properties.columns設定を使用して、列をマッピングし、BIGINT 型のvisit_user_idデータをhll_hash関数で HLL 型に変換します。
CREATE TABLE `hll_uv` ( `page_id` INT, `visit_date` TIMESTAMP, `visit_user_id` BIGINT ) WITH ( 'connector' = 'starrocks', 'jdbc-url' = 'jdbc:mysql://<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:9030', 'load-url' = '<fe-{srClusterId}-internal.starrocks.aliyuncs.com>:8030', 'database-name' = 'test', 'table-name' = 'hll_uv', 'username' = 'admin', 'password' = '<password>', 'sink.properties.columns' = 'page_id,visit_date,visit_user_id,visit_users=hll_hash(visit_user_id)' ); -
-
Flink SQL クライアントでデータを挿入します。
異なるユーザーが異なる時刻にページにアクセスする状況をシミュレートするため、
hll_uvテーブルに複数の行を挿入します。visit_user_idは BIGINT 型です。Flink によって HLL 型に自動的に変換されます。INSERT INTO `hll_uv` VALUES (3, CAST('2023-07-24 12:00:00' AS TIMESTAMP), 78), (4, CAST('2023-07-24 13:20:10' AS TIMESTAMP), 2), (3, CAST('2023-07-24 12:30:00' AS TIMESTAMP), 674); -
SQL エディターで UV 数をクエリします。
StarRocks の集約機能を使用し、
COUNT(DISTINCT visit_users)でページごとのユニークビジター (UV) 数を算出します。SELECT `page_id`, COUNT(DISTINCT `visit_users`) FROM `hll_uv` GROUP BY `page_id`;結果は次のとおりです。
page_id count(DISTINCT visit_users) 0 4 1 1 3 2