I dati dimensionali che cambiano lentamente o in modo imprevedibile vengono acquisiti nelle analisi delle dimensioni che cambiano lentamente (SCD). In un ambiente di data warehouse, una tabella dimensionale dispone di una chiave primaria che identifica in modo univoco ogni record e altre informazioni note come dati dimensionali.
Tutti i metodi di aggiornamento per i diversi tipi di SCD possono essere eseguiti utilizzando il programma SortCL in IRI CoSort. In IRI Voracity è disponibile una procedura guidata per facilitare la creazione degli script di lavoro SCD utilizzati durante l'esecuzione del programma SortCL. La maggior parte delle varianti utilizza un join esterno completo per abbinare i record dell'origine dati anagrafica originale con i record nell'origine aggiornata in base all'equazione di una chiave di ciascuno. I record con le corrispondenze devono essere aggiornati nel master. I record nell'origine degli aggiornamenti che non hanno una corrispondenza devono essere aggiunti al master.
Ecco una panoramica di come aggiornare un file dimensionale utilizzando l'SCD di tipo 3 in cui mantengo i costi del prodotto. L'aggiornamento viene effettuato unendo rispetto al campo ProductCode .
SCD di tipo 3
Con il modello di tipo 3, i dati attuali e quelli storici sono riportati nello stesso record. Una delle cose principali da decidere è quanta storia dovrebbe essere conservata. Con il nostro esempio, manterrò un costo per tre date di inizio. Enddate è la data in cui il costo nel record non è più effettivo. Se il costo è ancora effettivo, allora EndDate1 il campo verrà impostato su 99991231. Questo per evitare un valore vuoto in questo campo. Ecco i valori contenuti nella sorgente master iniziale (master3.dat):
Codice prodotto | Costo1 | StartDate1 | EndDate1 | Costo2 | StartDate2 | EndDate2 | Costo3 | StartDate3 | EndDate3 |
---|---|---|---|---|---|---|---|---|---|
C123 | 125,50 | 20110228 | 99991231 | ||||||
F112 | 2365.00 | 20120101 | 99991231 | ||||||
G101 | 19:25 | 20110930 | 99991231 | 21:25 | 20110501 | 20110930 | |||
J245 | 450,50 | 20110430 | 99991231 | 425,25 | 20101001 | 20110430 | 385,25 | 20100215 | 20101001 |
S022 | 98,75 | 20110515 | 99991231 |
I record di aggiornamento hanno tutti lo stesso StartDate. L'origine update.dat contiene i seguenti valori di campo per i record:
Codice prodotto | Costo | Data di inizio |
---|---|---|
F112 | 2425,00 | 20120701 |
J245 | 550,50 | 20120701 |
M447 | 101,75 | 20120701 |
S022 | 101,75 | 20120701 |
Di seguito i dati aggiornati. Per ogni record che è stato aggiornato, ogni costo, data di inizio e data di fine viene spostato a destra di un set. Nel vecchio gruppo corrente per il record, la data di fine viene modificata in data di inizio per il nuovo set corrente aggiornato. Tutti i valori per il vecchio terzo set vengono scartati.
Codice prodotto | Costo1 | StartDate1 | EndDate1 | Costo2 | StartDate2 | EndDate2 | Costo3 | StartDate3 | EndDate3 |
---|---|---|---|---|---|---|---|---|---|
C123 | 125,50 | 20110228 | 9991231 | ||||||
F112 | 2425,00 | 20120701 | 9991231 | 2365.00 | 20120101 | 20120701 | |||
G101 | 19:25 | 20110930 | 9991231 | 21:25 | 20110501 | 20110930 | |||
J245 | 550,50 | 20120701 | 9991231 | 450,50 | 20110430 | 20120701 | 425,25 | 20101001 | 20110430 |
M447 | 101,75 | 20120701 | 9991231 | ||||||
S022 | 101,75 | 20120701 | 9991231 | 98,75 | 20110515 | 20120701 |
In IRI Workbench, è disponibile una procedura guidata Voracity per assistere nella creazione di script per l'aggiornamento di file e tabelle dimensionali. Questa procedura guidata si trova nel menu a discesa Voracity sulla barra di navigazione. Per prima cosa scegli il tipo di SCD. Quindi viene visualizzata la finestra in cui si selezionano i file utilizzati per l'elaborazione dell'aggiornamento.
Nella tabella in alto nella schermata successiva, si determina come i dati aggiornati vengono mappati sul master. Nel raggruppamento centrale dello schermo, scegli i campi che forniscono i valori di stato per i record in fase di aggiornamento.
Nei menu a discesa in Attuale e Insiemi di campi storici , il primo set definito, fornisce i nomi dei campi per i valori correnti. Campo di valore è il valore dimensionale che viene aggiornato. Campo di inizio è il campo che determina quando il Campo valore è diventato attivo e Fine campo determina quando non è più valido. Quindi definisci tutti i set necessari per il numero di valori storici che vengono mantenuti.
Ecco lo script del lavoro che aggiornerà il file master:
/INFILE=master3.dat /PROCESS=DELIMITED /ALIAS=master3 /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",") /FIELD=(COST1, TYPE=NUMERIC, POSITION=2, SEPARATOR=",") /FIELD=(STARTDATE1, TYPE=ASCII, POSITION=3, SEPARATOR=",") /FIELD=(ENDDATE1, TYPE=ASCII, POSITION=4, SEPARATOR=",") /FIELD=(COST2, TYPE=NUMERIC, POSITION=5, SEPARATOR=",") /FIELD=(STARTDATE2, TYPE=ASCII, POSITION=6, SEPARATOR=",") /FIELD=(ENDDATE2, TYPE=ASCII, POSITION=7, SEPARATOR=",") /FIELD=(COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",") /FIELD=(STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",") /FIELD=(ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",") /INFILE=update.dat /PROCESS=DELIMITED /ALIAS=update /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(COST, TYPE=ASCII, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /JOIN FULL_OUTER master3 update WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master3.dat # Include only records that are to be updated /PROCESS=DELIMITED /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",") /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",") /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",") /FIELD=(ENDDATE1_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",") /FIELD=(MASTER3.COST1, TYPE=NUMERIC, POSITION=5, SEPARATOR=",") /FIELD=(MASTER3.STARTDATE1, TYPE=ASCII, POSITION=6, SEPARATOR=",") /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=7, SEPARATOR=",") /FIELD=(MASTER3.COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",") /FIELD=(MASTER3.STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",") /FIELD=(MASTER3.ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",") /INCLUDE WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master3.dat # Include only records that are not to be updated /PROCESS=DELIMITED /FIELD=(MASTER3.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",") /FIELD=(MASTER3.COST1, TYPE=NUMERIC, POSITION=2, SEPARATOR=",") /FIELD=(MASTER3.STARTDATE1, TYPE=ASCII, POSITION=3, SEPARATOR=",") /FIELD=(MASTER3.ENDDATE1, TYPE=ASCII, POSITION=4, SEPARATOR=",") /FIELD=(MASTER3.COST2, TYPE=NUMERIC, POSITION=5, SEPARATOR=",") /FIELD=(MASTER3.STARTDATE2, TYPE=ASCII, POSITION=6, SEPARATOR=",") /FIELD=(MASTER3.ENDDATE2, TYPE=ASCII, POSITION=7, SEPARATOR=",") /FIELD=(MASTER3.COST3, TYPE=NUMERIC, POSITION=8, SEPARATOR=",") /FIELD=(MASTER3.STARTDATE3, TYPE=ASCII, POSITION=9, SEPARATOR=",") /FIELD=(MASTER3.ENDATE3, TYPE=ASCII, POSITION=10, SEPARATOR=",") /OMIT WHERE MASTER3.PRODUCTCODE == UPDATE.PRODUCTCODE /OMIT WHERE MASTER3.PRODUCTCODE EQ "" /OUTFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/SCD3/master3.dat # Add new records /PROCESS=DELIMITED /FIELD=(UPDATE.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",") /FIELD=(UPDATE.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",") /FIELD=(UPDATE.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",") /FIELD=(ENDDATE1_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",") /INCLUDE WHERE MASTER3.PRODUCTCODE EQ "" AND UPDATE.PRODUCTCODE NE ""