![]() 前へ |
![]() 次へ |
シナリオ
会社では、発生する挿入、更新および削除トランザクションをすべてrecord.csv.というフラット・ファイルに記録しています。これらのトランザクションは、格納された順序に正確に従って処理される必要があります。たとえば、あるトランザクションの順番が配置、更新、キャンセル、再入力となっていた場合、このトランザクションはこの順序に従って処理される必要があります。
ソース・ファイルrecord.csvのデータ・セットの例は次のように定義されます。
Action,DateTime,Key,Name,Desc I,71520031200,ABC,ProdABC,Product ABC I,71520031201,CDE,ProdCDE,Product CDE I,71520031202,XYZ,ProdXYZ,Product XYZ U,71620031200,ABC,ProdABC,Product ABC with option D,71620032300,ABC,ProdABC,Product ABC with option I,71720031200,ABC,ProdABC,Former ProdABC reintroduced U,71720031201,XYZ,ProdXYZ,Rename XYZ
次のようにターゲット表にデータをロードする必要があります。
SRC_TIMESTA KEY NAME DESCRIPTION ----------- --- ------- --------------------------- 71520031201 CDE ProdCDE Product CDE 71720031201 XYZ ProdXYZ Rename XYZ 71720031200 ABC ProdABC Former ProdABC reintroduced
解決策
Warehouse Builderを使用してETLロジックを設計し、トランザクションがソースに格納された時間的な順序に正確に従ってデータをロードできます。このためには、ターゲット表にデータをロードする前に、データの順序付けおよび条件付きの分割を行うマッピングを設計します。次に、行ベースのオペレーティング・モードでコードを生成するためのマッピングを構成します。次の例に示すように、行ベースのオペレーティング・モードでは、Warehouse Builderによりif-then-else構造を使用して行ごとにデータを処理するコードが生成されます。
CURSOR
SELECT
"DATETIME$1"
FROM
"JOURNAL_EXT"
ORDER BY "JOURNAL_EXT"."DATETIME" ASC
LOOP
IF "ACTION" = 'I' THEN
INSERT this row
ELSE
IF "ACTION" = 'U' THEN
UPDATE this row
ELSE
DELETE FROM
"TARGET_FOR_JOURNAL_EXT"
END LOOP;
これにより、確実に、一連のアクションは連続する順序で実装され、トランザクションが記録された順序に従ってデータがロードされます。
事例
この事例では、Warehouse Builderを使用して特定の順序でトランザクション・データをロードするためのETLロジックを作成する方法を示します。
手順1: ソース・フラット・ファイルrecord.csvのインポートおよびサンプリング
この例では、フラット・ファイルrecord.csvにすべてのトランザクション・レコードおよびタイムスタンプが格納されます。Warehouse Builderのインポート・メタデータ・ウィザードを使用して、ソース・システムからこのフラット・ファイルをインポートします。次に、フラット・ファイル・サンプル・ウィザードを使用して、Warehouse Builder内のフラット・ファイルのメタデータを定義します。
|
注意: システムが表から取得されている場合は、このフラット・ファイルと通常の表を置き換えることができます。この場合は、手順3に進みます。 |
手順2: 外部表の作成
マッピング内のサンプリングされたフラット・ファイルの使用を単純化するには、手順1でインポートおよびサンプリングされたフラット・ファイルに基づき、外部表の作成ウィザードを使用して外部表(JOURNAL_EXT)を作成します。
フラット・ファイルのかわりに外部表を使用する利点は、外部表によりフラット・ファイル内のデータに直接アクセスするSQLが提供される点です。したがって、データをステージングする必要はありません。
ステップ3: マッピングの設計
このマッピングでは、データを並べ替える演算子に続いて、条件に基づいてデータを分割する演算子を使用し、その後にターゲット表にデータをロードすることで、トランザクション・データを外部ソースから移動します。
ソーター演算子により、データの順序付けが可能になり、またソースで記録された順序に正確に従ってトランザクションを処理できます。スプリッタ演算子により、生成済コード内でif-then-else制約として機能する分割条件を定義することで、ソース・データ内に記録されたすべての挿入、更新および削除を条件付きで処理できます。データは条件付きで分割され、ターゲット表にロードされます。このマッピングでは、条件付きロードを説明するために、同じターゲット表を3回使用します。マッピング表TARGET 1、TARGET 2およびTARGET 3は、すべて同じワークスペース表TARGETにバインドされます。すべてのデータは、単一のターゲット表に挿入されます。
次の手順は、このマッピングを作成する方法を示します。
手順4: マッピングの作成
「マッピングの作成」ダイアログ・ボックスを使用してLOAD_JOURNAL_EXTというマッピングを作成します。Warehouse Builderによりマッピング・エディタが開かれ、そこでマッピングを作成できます。
手順5: 外部表演算子の追加
マッピング外部表演算子をマッピング・エディタ上にドラッグ・アンド・ドロップし、外部表JOURNAL_EXTにマッピング外部表演算子をバインドします。
手順6: データの順序付け
ソーター演算子を追加して、トランザクション・データのターゲット表へのロード順序を指定するOrder By句を定義します。
手順7: 分割条件の定義
スプリッタ演算子を追加して、トランザクション・データに格納された挿入、更新および削除を条件付きで分割します。この分割条件は、生成済コード内でif-then-else制約として機能します。
トランザクションの各タイプに対する分割条件を定義します。OutgroupのINSERT_DATAには、INGRP1.ACTION = 'I'という分割条件を定義します。UPDATE_DATAには、INGRP1.ACTION = 'U'という分割条件を定義します。Warehouse Builderは、スプリッタ演算子にREMAINING_ROWSと呼ばれるデフォルトのグループがあり、そのグループによりすべての削除(「D」)レコードが自動的に処理されます。
手順8: ターゲット表の定義
トランザクションの各タイプ(INSERT_DATA、UPDATE_DATAおよびREMAINING_ROWS)に対し、同じワークスペース・ターゲット表をそれぞれに使用します。
手順9: マッピングLOAD_JOURNAL_EXTの構成
マッピングを定義した後、コードを生成するためにマッピングを構成する必要があります。この例の目的は、格納された順序に正確に従ってデータを処理することであるため、デフォルトのオペレーティング・モードとして行ベースを選択する必要があります。このモードでは、行ごとにデータが処理され、ターゲット表での挿入、更新および削除アクションは、ソースでトランザクションが記録された順序に正確に従って発生します。
Warehouse Builderでは、すべての挿入トランザクションに対して1つの文が作成され、すべての更新トランザクションおよびすべての削除操作に対してもそれぞれ1つの文が作成されるので、セット・ベース・モードは選択しません。コードによりこれらのプロシージャが次々にコールされ、1つのアクションが完了してから次のアクションを行います。たとえば、最初にすべての挿入が処理され、次にすべての更新が処理され、続いてすべての削除が処理されます。
トランザクション・データをロードするためのマッピングを構成する手順は、次のとおりです。
プロジェクト・ナビゲータで、LOAD_JOURNAL_EXTマッピングを右クリックして「構成」を選択します。
「ランタイム・パラメータ」ノードを開き、「デフォルト・オペレーティング・モード」パラメータを「行ベース」に設定します。
この例では、他のすべてのパラメータに対して、デフォルト値を使用します。コードを生成する前にマッピングを検証します。
手順10: コードの生成
マッピングを生成した後、Warehouse Builderでは、生成結果ウィンドウに結果が表示されます。
コードを調べると、Warehouse Builderでは連続したアクションのすべてが行ベース・モードで実装されていることがわかります。これはデータが行ごとに処理されることを示し、また、Warehouse Builderによりif-then-else構造を使用して発生順にすべての条件が評価されることを示します。このため、結果のターゲット表ではソースに記録されているトランザクションの順序の整合性が保持されます。