すべてのプロダクト
Search
ドキュメントセンター

E-MapReduce:Flink コネクタ

最終更新日:Jun 21, 2026

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」をご参照ください。

パラメーターの説明

パラメーター

必須

デフォルト値

説明

connector

はい

NONE

コネクタを StarRocks として指定します。このパラメーターを starrocks に設定します。

jdbc-url

はい

NONE

StarRocks でクエリを実行するために使用します。

例: jdbc:mysql://fe-c-9b354c83e891-internal.starrocks.aliyuncs.com:9030。 ここで、fe-c-9b354c83e891-internal.starrocks.aliyuncs.com は、お使いの EMR Serverless StarRocks インスタンス内の FE ノードのプライベートネットワークアドレスです。

注意

EMR Serverless StarRocks インスタンス内の FE ノードのプライベートネットワークアドレスを取得する方法については、「インスタンスリストと詳細の表示」をご参照ください。

load-url

はい

NONE

FE ノードのプライベートネットワークアドレスと HTTP ポートを お使いの EMR Serverless StarRocks インスタンス内の FE ノードのプライベートネットワークアドレス:8030 の形式で指定します。

例: fe-c-9b354c83e891****-internal.starrocks.aliyuncs.com:8030

database-name

はい

NONE

StarRocks データベースの名前。

table-name

はい

NONE

StarRocks テーブルの名前。

username

はい

NONE

StarRocks インスタンスのユーザー名。例えば、デフォルトのユーザー名は admin です。

Flink コネクタを使用して StarRocks にデータをインポートするには、ターゲットテーブルに対する SELECT および INSERT 権限が必要です。ユーザーアカウントにこれらの権限がない場合は、まず権限を付与してください。詳細については、「ユーザー管理とデータ認可」をご参照ください。

password

はい

NONE

StarRocks インスタンスのパスワード。

sink.semantic

いいえ

at-least-once

ターゲットシステムへのデータ書き込み時の信頼性と一貫性を保証するため、シンクのセマンティクス保証レベルを定義します。有効な値:

  • at-least-once: データが少なくとも 1 回書き込まれることを保証します。データの重複が発生する可能性があります。

  • exactly-once: データが正確に 1 回書き込まれることを保証し、重複や損失がありません。

sink.version

いいえ

AUTO

データインポートインターフェイスを指定します。このパラメーターは Flink コネクタ 1.2.4 以降でサポートされています。

  • V1: Stream Load インターフェイスを使用してデータをインポートします。Flink コネクタ 1.2.4 より前のバージョンは、このモードのみをサポートしています。

  • V2: Stream Load トランザクションインターフェイスを使用してデータをインポートします。StarRocks 2.4 以降が必要です。メモリ使用量が削減され、より安定した exactly-once 実装が提供されるため、V2 を推奨します。

  • AUTO: StarRocks のバージョンが Stream Load トランザクションインターフェイスをサポートしている場合は V2 を自動的に選択します。それ以外の場合は V1 を選択します。

sink.label-prefix

いいえ

NONE

Stream Load のラベルプレフィックスを指定します。Flink コネクタ 1.2.8 以降を使用し、exactly-once セマンティクスが必要な場合は、ラベルプレフィックスを設定することを推奨します。

sink.buffer-flush.max-bytes

いいえ

94371840 (90 MB)

Stream Load を介して StarRocks に 1 バッチでインポートされる前に、メモリにバッファリングされるデータの最大サイズ。値を大きくするとインポートパフォーマンスが向上しますが、インポートレイテンシが増加する可能性があります。

有効範囲: [64 MB、10 GB]。

説明
  • このパラメーターは、sink.semanticat-least-once に設定されている場合にのみ有効です。

  • sink.semanticexactly-once に設定されている場合、メモリ内のデータは Flink チェックポイントがトリガーされたときにのみフラッシュされます。この場合、sink.buffer-flush.max-bytes パラメーターは、サイズのしきい値に基づいてデータが自動的にフラッシュされないため、効果がありません。

sink.buffer-flush.max-rows

いいえ

500000

Stream Load を介して StarRocks に 1 バッチでインポートされる前に、メモリにバッファリングされる行の最大数。

有効範囲: [64000、5000000]。

説明

このパラメーターは、sink.versionV1 に設定され、sink.semanticat-least-once に設定されている場合にのみ有効です。

sink.buffer-flush.interval-ms

いいえ

300000

データ送信の間隔 (ミリ秒単位)。StarRocks へのデータ書き込みのレイテンシを制御します。

有効範囲: [1000、3600000]。

説明

このパラメーターは、sink.semanticat-least-once に設定されている場合にのみ有効です。

sink.max-retries

いいえ

3

Stream Load 失敗後の最大再試行回数。この制限を超えると、データインポートタスクは失敗します。

有効範囲: [0、10]。

説明

このパラメーターは、sink.versionV1 に設定されている場合にのみ有効です。

sink.connect.timeout-ms

いいえ

30000

FE ノードとの HTTP 接続を確立するためのタイムアウト (ミリ秒単位)。

有効範囲: [100、60000]。

Flink Connector 1.2.9 より前のバージョンでは、デフォルト値は 1000 です。

sink.socket.timeout-ms

いいえ

-1

Flink Connector 1.2.10 以降でサポートされています。HTTP クライアントがデータを待機するためのタイムアウト (ミリ秒) で、デフォルト値の -1 はタイムアウトがないことを意味します。

sink.wait-for-continue.timeout-ms

いいえ

10000

Flink コネクタ 1.2.7 以降でサポートされています。FE HTTP 100-continue レスポンスを待機するためのタイムアウト (ミリ秒単位) です。

有効範囲: [3000、60000]。

sink.ignore.update-before

いいえ

TRUE

Flink コネクタ 1.2.8 以降でサポートされています。プライマリキーテーブルにデータをインポートする際、Flink からの UPDATE_BEFORE レコードを無視するかどうかを指定します。false に設定すると、このようなレコードはプライマリキーテーブルで DELETE 操作として扱われます。

sink.parallelism

いいえ

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

部分更新を有効にするかどうかを指定します。有効な値: TRUE および FALSE (デフォルト)。

sink.properties.partial_update_mode

いいえ

row

部分更新モードを指定します。有効な値:

  • row (デフォルト): 行ベースの部分更新を使用します。列が多く、バッチが小さいリアルタイム更新シナリオに適しています。

  • column: 列ベースの部分更新を使用します。列が少なく、行数が多いバッチ更新シナリオに適しています。列モードを有効にすると、このようなシナリオでの更新パフォーマンスが大幅に向上します。

sink.properties.strict_mode

いいえ

false

Stream Load の厳格モードを有効にするかどうかを指定します。厳格モードは、無効な行 (列値が一致しない行など) が検出されたときのインポート動作に影響します。

有効な値は truefalse です。

sink.properties.compression

いいえ

NONE

Flink コネクタ 1.2.10 以降でサポートされています。Stream Load の圧縮アルゴリズムを指定します。現在、JSON フォーマットのみが圧縮をサポートしています。

有効な値: lz4_frame

説明

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 クラスターへのアップロード

  1. 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:手動コンパイル

    1. Flink コネクタのソースコード をダウンロードします。

    2. 次のコマンドを実行して、Flink コネクタのソースコードを JAR ファイルにコンパイルします:

      sh build.sh <flink_version>

      たとえば、Flink バージョンが 1.17 の場合は、次のコマンドを実行します:

      sh build.sh 1.17
    3. コンパイル後、生成された 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 コネクタのバージョン番号。

  2. 取得した Flink コネクタ JAR ファイルを、お使いの Flink クラスターの flink-{flink_version}/lib ディレクトリにアップロードします。

    たとえば、バージョン EMR-5.19.0 の EMR クラスターを使用する場合、JAR ファイルを /opt/apps/FLINK/flink-current/lib ディレクトリに配置します。

Flink クラスターの起動

  1. お使いの Flink クラスターのマスターノードにログインします。 詳細については、「クラスターへのログイン」をご参照ください。

  2. 次のコマンドを実行して Flink クラスターを起動します:

    /opt/apps/FLINK/flink-current/bin/start-cluster.sh

Flink SQL を使用したデータの書き込み

  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)
    DISTRIBUTED BY HASH(id);
  2. Flink クラスターのマスターノードにログインします。詳細については、「クラスターへのログイン」をご参照ください。

  3. 次のコマンドを実行して、Flink SQL を起動します。

    /opt/apps/FLINK/flink-current/bin/sql-client.sh
  4. 次のコマンドを実行して、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 以降と併用することを推奨します。

ベストプラクティス

プライマリキーテーブルへのインポート

  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`);
  2. StarRocks テーブルにデータを挿入します。

    INSERT INTO `test`.`score_board` VALUES (1, 'starrocks', 100), (2, 'flink', 100);
  3. 次のコマンドを実行して Flink SQL クライアントを起動します。

    /opt/apps/FLINK/flink-current/bin/sql-client.sh
  4. データを更新します。

    部分更新

    部分更新では、score などの他の列に影響を与えることなく、name などの特定の列のみを更新できます。

    1. 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 コネクタによって自動的に設定されます。

    2. 更新データを挿入します。

      既存データと同じプライマリキーを持ち、name 列の値のみを変更した 2 行を挿入します。

      INSERT INTO score_board VALUES (1, 'starrocks-update'), (2, 'flink-update');
    3. SQL エディターで StarRocks テーブルをクエリします。

      SELECT * FROM `test`.`score_board`;

      name 列の値のみが変更され、score 列は変更されていないことを確認できます。

      クエリは、id=1, name=starrocks-update, score=100id=2, name=flink-update, score=100 の 2 レコードを返します。

    条件付き更新

    この例では、score 列の値に基づいて条件付き更新を実行する方法を示します。受信データの score の値が、StarRocks テーブルの現在の値以上の場合にのみ、行が更新されます。

    1. 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_conditionscore に設定します。これにより、Flink コネクタはデータ書き込み時の更新条件として score 列を使用します。

      • sink.versionV1 に設定します。これにより、Flink コネクタはストリームロードインターフェイスを使用してデータをインポートします。

    2. Flink SQL クライアントで 2 行のデータをテーブルに挿入します。

      これらの行は、StarRocks テーブル内の既存の行と同じプライマリキーを持っています。1 行目の score の値は小さく、2 行目の score の値は大きいです。

      INSERT INTO `score_board` VALUES (1, 'starrocks-update', 99), (2, 'flink-update', 101);
    3. 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 数をクエリする方法を示します。

  1. SQL エディターで StarRocks の集計テーブルを作成します。

    test データベースに、次の仕様で page_uv という名前の集計テーブルを作成します:

    • visit_users 列を BITMAP 型として定義し、BITMAP_UNION 集計関数を設定します。

    • page_idvisit_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`);
  2. 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)'
    );
  3. 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);
  4. 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 数をクエリする方法を示します。

  1. SQL エディターで StarRocks の集計テーブルを作成します。

    test データベースに、次の仕様で hll_uv という名前の集計テーブルを作成します:

    • visit_users 列を HLL 型として定義し、HLL_UNION 集計関数を設定します。

    • page_idvisit_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`);
  2. 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)'
    );
  3. 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);
  4. 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