Snowflake ストリームの作成と使用

Snowflake ストリームの作成と使用

  • オーケストレーション
6分で読めます 更新日 Oct 28, 2020

ポイント: Snowflake ストリームの作成と使用により、データ管理のためのテーブル変更の効率的な追跡が可能になります。このガイドでは、ストリームのセットアップ、テーブルの作成、在庫の更新の自動化を扱います。

  • ストリームはトリガーのように機能し、処理のためにデータ変更をキャプチャします。
  • 使用法を示すために在庫補充シナリオを含みます。

このチュートリアルでは、Snowflake でストリームを作成および使用する方法を示します。

Snowflake ストリームの説明

Snowflake ストリーム(テーブルストリームの略)は、テーブルへの変更を追跡します。Snowflake ストリームを使用して:

  • トリガーをエミュレートする(トリガーとは異なり、ストリームは即座に発火しません)
  • 変更をステージングテーブルに集め、一定の頻度でそれに基づいて他のテーブルを更新します

ここでは、サンプルシナリオを作成します: 在庫補充システム。補充注文を受け取ったときは、手持ちの在庫を増やす必要があります。

このタスクは手動で実行します。実際の使用では、何らかの固定スケジュールで Snowflake タスクとして実行したいでしょう。

データ、ストリーム、およびテーブルを作成

進めるために、注文と製品のテーブルを作成します:

チュートリアルユースケース

  • 注文は在庫の移動です。
  • 製品は手持ちの在庫数量を保持します。

25 アイテムから始めて、25、25、25 の 3 回の補充注文を行うと、最後には 100 アイテムが手元にあります。これら 3 回の注文を合計し、25 の初期残高に 75 を加えると 100 になります。

これらの 2 つのテーブルを作成します:

    CREATE TABLE orders
  ( 
     customernumber     varchar(100) PRIMARY KEY,
    ordernumber varchar(100),
    comments varchar(200),
    orderdate date,
    ordertype varchar(10),
    shipdate date,
discount number,
quantity int,
    productnumber varchar(50)
)
    create table products (
      productnumber varchar(50) primary key,
      movementdate datetime,
      quantity number,
      movementtype varchar(10));

今、製品テーブルに製品を追加し、初期の手持ち在庫を 100 ユニットに設定します。

    insert into products(productnumber, quantity) values ('EE333', 100);

今、注文テーブルにストリームを作成します。Snowflake はそのテーブルへの変更を追跡し始めます。

    CREATE OR REPLACE STREAM orders_STREAM on table orders;

今、注文を作成します。

    insert into orders (customernumber,ordernumber,comments,orderdate,ordertype,shipdate,discount,quantity,productnumber) values ('855','533','jqplygemaq','2020-10-08','sale','2020-10-18','0.10503143596496034','65','EE333')

次に、orders_stream テーブルをクエリします:

    select * from orders_stream

結果は次のとおりです。1 件のレコードを追加したことがわかります。

手持ち在庫の更新

在庫に 65 アイテムが追加されたので、在庫残高を更新する必要があります。手順は次のとおりです。

begin ステートメントを使用してトランザクションを開始します。

    begin;

次に、この更新ステートメントを実行します。基本的には:

  • 各製品の注文を合計します。
  • 注文数量の合計を元の在庫残高に加えます。

この更新ステートメントは、orders_stream テーブルから製品番号を取得します。それが Snowflake にどの製品の在庫を更新する必要があるかを示すテーブルです。

    update products
     set quantity = onhand 
     from 
      (select distinct p.productnumber, 
            p.quantity as dquantity, 
            o.quantity , 
            p.quantity + o.quantity as onhand
       from products p
       inner join orders o on 
              p.productnumber = o.productnumber)  as z 
        where z.productnumber = (select productnumber from orders_stream)
    commit:

この時点で orders_stream テーブルは空になります。これは、それを読み取る操作を実行したときに発生します。

(注: Begin と commit はトランザクションを作成します。これは論理的に関連する一連の SQL ステートメントです。これらは関与するテーブルをロックします。それがないと、一方のトランザクションが機能し、もう一方が機能しないため、不整合な状況が発生する可能性があります。)

今、orders_stream をクエリすると、そのテーブルは空であることがわかります。

追加リソース

このようなチュートリアルをさらに探すには、これらのリソースを参照してください:

これらの投稿は私のものであり、必ずしも BMC の立場、戦略、または意見を表すものではありません。

オーケストレーションの関連記事

The Briefを購読する

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ありがとう

あなたはThe Briefに登録されました
The Briefはメインフレームとエンタープライズオーケストレーション—BMC AMIとControl-M—および、両者に関するアナリストの研究、顧客の展開、イベントをカバーしています。