0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Snowflake の Stage でウォーターマークをチェックポイントとして管理する方法

0
Posted at

概要

本記事では、Snowflake において、クエリベース CDC などの増分データ連携で使用するチェックポイントを、Stage 上の JSON ファイルで管理する方法を検証します。

増分データ連携では、前回どこまでデータを処理したかを把握するために、更新日時などの値をウォーターマーク(Watermark)として管理する必要があります。

本記事では、ソーステーブルごとにウォーターマークを含むチェックポイントを JSON ファイルとして保存し、次のライフサイクルを管理する方法を紹介します。

  1. 初期状態の判定
  2. チェックポイントの作成
  3. チェックポイントの参照
  4. チェックポイントの更新

事前準備

データベースとスキーマを作成

CREATE OR REPLACE DATABASE CDC_CHECKPOINT_LIFECYCLE_DB;
CREATE OR REPLACE SCHEMA CDC_CHECKPOINT_LIFECYCLE_DB.TEST_SCHEMA;
USE DATABASE CDC_CHECKPOINT_LIFECYCLE_DB;
USE SCHEMA TEST_SCHEMA;

image.png

Stage を作成

チェックポイントを JSON ファイルとして保存するための内部 Stage を作成します。FILE_FORMATを指定することで、クエリ実行時にファイルフォーマットを指定せずにクエリできます。

CREATE OR REPLACE STAGE CHECKPOINT_STAGE
    FILE_FORMAT = (TYPE = JSON COMPRESSION = NONE);

image.png

手順

初期状態の判定

最初に、チェックポイントファイルの存在を確認し、初回実行かどうかを判定します。取得結果が 0 件の場合はチェックポイントファイルが存在しないため、初期状態と判定します。この場合、前回の処理位置を示すウォーターマークが存在しないため、初回処理用の開始位置を設定する必要があります。

LIST @CHECKPOINT_STAGE/CDC_CHECKPOINT_LIFECYCLE_DB.TEST_SCHEMA.ORDERS/ 
    PATTERN = '.*checkpoint[.]json$';
SELECT COUNT(*)
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));

image.png

チェックポイントの作成

チェックポイント情報を JSON 形式で Stage に出力します。

EXECUTE IMMEDIATE $$
DECLARE
    v_checkpoint VARIANT;
BEGIN
    -- チェックポイントの JSON を変数に格納
    SELECT OBJECT_CONSTRUCT_KEEP_NULL(
        'schema_version', 1,
        'source_table', 'UNLOAD_QUERY_CDC_TEST_DB.TEST_SCHEMA.ORDERS',
        'wartermark_column', 'AUDIT__UPDATA1_TIMESTAMP',
        'wartermark_value', '2026-10-04T17:00:00.000000000Z',
        'unloaded_rows', 3
    )
    INTO :v_checkpoint;

    -- JSON ファイルに出力
    COPY INTO
        @CHECKPOINT_STAGE/CDC_CHECKPOINT_LIFECYCLE_DB.TEST_SCHEMA.ORDERS/checkpoint.json
    FROM (
        SELECT :v_checkpoint
    )
    FILE_FORMAT = (TYPE = JSON COMPRESSION = NONE)
    SINGLE = TRUE
    OVERWRITE = TRUE;

    RETURN 'Checkpoint written successfully';
END;
$$;

image.png

チェックポイントの参照

作成したチェックポイントを参照し、保存された情報を確認します。

LIST @CHECKPOINT_STAGE/CDC_CHECKPOINT_LIFECYCLE_DB.TEST_SCHEMA.ORDERS/ 
    PATTERN = '.*checkpoint[.]json$';
name size md5 last_modified
checkpoint_stage/CDC_CHECKPOINT_LIFECYCLE_DB.TEST_SCHEMA.ORDERS/checkpoint.json 208 0e3bfff8cc0a731777b0e067b5698ec3 Sat, 10 Oct 2026 07:49:13 GMT
SELECT
    $1 AS value,
    $1:schema_version::INT AS schema_version,
    $1:source_table::STRING AS source_table,
    $1:wartermark_column::STRING AS wartermark_column,
    $1:wartermark_value::STRING AS wartermark_value,
    $1:unloaded_rows::INT AS unloaded_rows
FROM
    @CHECKPOINT_STAGE/CDC_CHECKPOINT_LIFECYCLE_DB.TEST_SCHEMA.ORDERS/checkpoint.json;
VALUE SCHEMA_VERSION SOURCE_TABLE WARTERMARK_COLUMN WARTERMARK_VALUE UNLOADED_ROWS
{ "schema_version": 1, "source_table": "UNLOAD_QUERY_CDC_TEST_DB.TEST_SCHEMA.ORDERS", "unloaded_rows": 3, "wartermark_column": "AUDIT__UPDATA1_TIMESTAMP", "wartermark_value": "2026-10-04T17:00:00.000000000Z" } 1 UNLOAD_QUERY_CDC_TEST_DB.TEST_SCHEMA.ORDERS AUDIT__UPDATA1_TIMESTAMP 2026-10-04T17:00:00.000000000Z 3

image.png

ウォーターマークの更新

増分データ連携の処理が完了したことを想定し、チェックポイントに保存されているウォーターマークを更新します。OVERWRITE = TRUE を指定しているため、同名のチェックポイントファイルが存在する場合は、新しいチェックポイント情報で上書きされます。

EXECUTE IMMEDIATE $$
DECLARE
    v_checkpoint VARIANT;
BEGIN
    -- チェックポイントの JSON を変数に格納
    SELECT OBJECT_CONSTRUCT_KEEP_NULL(
        'schema_version', 1,
        'source_table', 'UNLOAD_QUERY_CDC_TEST_DB.TEST_SCHEMA.ORDERS',
        'wartermark_column', 'AUDIT__UPDATA1_TIMESTAMP',
        'value', '2026-10-10T17:00:00.000000000Z',
        'unloaded_rows', 100
    )
    INTO :v_checkpoint;

    -- JSON ファイルに出力
    COPY INTO
        @CHECKPOINT_STAGE/CDC_CHECKPOINT_LIFECYCLE_DB.TEST_SCHEMA.ORDERS/checkpoint.json
    FROM (
        SELECT :v_checkpoint
    )
    FILE_FORMAT = (TYPE = JSON COMPRESSION = NONE)
    SINGLE = TRUE
    OVERWRITE = TRUE;

    RETURN 'Checkpoint written successfully';
END;
$$;

image.png

チェックポイントファイルが同じパスに存在し、ファイルサイズや最終更新日時などが変化したことを確認します。この仕組みにより、次回の増分データ連携では、更新されたウォーターマークを基準に処理を再開できます。

LIST @CHECKPOINT_STAGE/CDC_CHECKPOINT_LIFECYCLE_DB.TEST_SCHEMA.ORDERS/ 
    PATTERN = '.*checkpoint[.]json$';
name size md5 last_modified
checkpoint_stage/CDC_CHECKPOINT_LIFECYCLE_DB.TEST_SCHEMA.ORDERS/checkpoint.json 192 0c6b3fcb8659845f28be9d06f07aabb3 Sat, 10 Oct 2026 07:49:14 GMT
SELECT
    $1 AS value,
    $1:schema_version::INT AS schema_version,
    $1:source_table::STRING AS source_table,
    $1:wartermark_column::STRING AS wartermark_column,
    $1:wartermark_value::STRING AS wartermark_value,
    $1:unloaded_rows::INT AS unloaded_rows
FROM
    @CHECKPOINT_STAGE/CDC_CHECKPOINT_LIFECYCLE_DB.TEST_SCHEMA.ORDERS/checkpoint.json;
VALUE SCHEMA_VERSION SOURCE_TABLE WARTERMARK_COLUMN WARTERMARK_VALUE UNLOADED_ROWS
{ "schema_version": 1, "source_table": "UNLOAD_QUERY_CDC_TEST_DB.TEST_SCHEMA.ORDERS", "unloaded_rows": 0, "value": "2026-10-10T17:00:00.000000000Z", "wartermark_column": "AUDIT__UPDATA1_TIMESTAMP" } 1 UNLOAD_QUERY_CDC_TEST_DB.TEST_SCHEMA.ORDERS AUDIT__UPDATA1_TIMESTAMP 0

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?