ゆっくりまたは予測できないほど変化するディメンションデータは、Slowly Changes Dimensions(SCD)分析でキャプチャされます。データウェアハウス環境では、ディメンションテーブルには、ディメンションデータと呼ばれる各レコードやその他の情報を一意に識別する主キーがあります。
さまざまなSCDタイプのすべての更新方法は、IRICoSortのSortCLプログラムを使用して実行できます。 IRI Voracityには、SortCLプログラムの実行時に使用されるSCDジョブスクリプトの作成を支援するウィザードがあります。ほとんどのタイプは、完全な外部結合を使用して、元のデータソースのレコードを、それぞれのキーの同等化に基づいて更新ソースのレコードと照合します。一致するレコードを更新する必要があります。一致するものがない更新ソースのレコードをマスターに追加する必要があります。
この記事では、更新データからの新しい情報がマスターソースの元の情報を上書きするSCDタイプ1モデルについて説明します。一致しない更新ソースのレコードが新しいマスターに追加されます。このモデルは古い値を現在の値で上書きする必要があり、履歴を保持しないため、あまり使用されません。
更新は、フィールドProductCodeに関して結合することによって実行されます。この例では、現在のデータはソースファイルmaster1.datになり、update.datは、現在のマスターソースに値を変更したりレコードを追加したりするために使用されます。
master1.datソースには次のものが含まれます:
ProductCode | StartDate | |
---|---|---|
C123 | 125.50 | 20110228 |
F112 | 2365.00 | 20120101 |
G101 | 19.25 | 20110930 |
J245 | 450.50 | 20110430 |
S022 | 98.75 | 20110515 |
この場合、更新データはすべて同じ開始日を持ちます。 update.datソースには、次の値のレコードが含まれています。
ProductCode | StartDate | |
---|---|---|
F112 | 2425.00 | 20120701 |
J245 | 550.50 | 20120701 |
M447 | 101.75 | 20120701 |
S022 | 101.75 | 20120701 |
新しいディメンションテーブルは、更新後に次の値になります。
ProductCode | StartDate | |
---|---|---|
C123 | 125.50 | 20110228 |
F112 | 2425.00 | 20120701 |
G101 | 19.25 | 20110930 |
J245 | 550.50 | 20120701 |
M447 | 139.25 | 20120701 |
S022 | 101.75 | 20120701 |
IRI Workbenchには、ディメンションファイルとテーブルを更新するためのスクリプトの作成を支援するウィザードがあります。このウィザードは、ナビゲーションバーの[Voracity]ドロップダウンにあります。まず、SCDタイプを選択します。次に、更新の処理に使用するファイルを選択するウィンドウが表示されます。
次の画面は、マスターソースと更新ソースで実行される結合を定義するためのものです
以下は、master1.datとupdate.datの2つのファイルを処理するときに生成されるsortclジョブスクリプトです。
/INFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/SCD1/master1.dat /PROCESS=DELIMITED /ALIAS=master1 /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /INFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/update.dat /PROCESS=DELIMITED /ALIAS=update /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /JOIN FULL_OUTER NOT_SORTED master1 NOT_SORTED update WHERE MASTER1.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=/master1.dat # This processes all except the new records /PROCESS=DELIMITED /FIELD=(MASTER1.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(COST_NEW, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"', IF MASTER1.PRODUCTCODE EQ UPDATE.PRODUCTCODE THEN UPDATE.COST ELSE MASTER1.COST) /FIELD=(STARTDATE_NEW, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"', IF MASTER1.PRODUCTCODE EQ UPDATE.PRODUCTCODE THEN UPDATE.STARTDATE ELSE MASTER1.STARTDATE) /INCLUDE WHERE MASTER1.PRODUCTCODE NE "" /OUTFILE=master1.dat # This processes the new records to be added /PROCESS=DELIMITED /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') I /INCLUDE WHERE MASTER1.PRODUCTCODE EQ ""