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 dei tipi SCD utilizza un join esterno completo per abbinare i record dell'origine dati originale con i record nell'origine degli aggiornamenti 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 2 in cui mantengo i costi del prodotto. L'aggiornamento viene effettuato unendo rispetto al campo ProductCode .
SCD di tipo 2
In questo modello, la documentazione attuale e quella storica sono conservate nello stesso archivio. In un database attivo avresti probabilmente una chiave surrogata da utilizzare come chiave primaria per il collegamento alle tabelle dei fatti oltre al CodiceProdotto chiave che viene utilizzata per il processo di aggiornamento. Poiché i record correnti e i record storici sono contenuti nello stesso file, è necessario disporre di un campo che indichi se il record è il record corrente per il CodiceProdotto e abbiamo bisogno di un campo per indicare quando il costo per il ProductCode non è più efficace. In questo esempio abbiamo:
- Codice Prodotto :Questo è il campo della chiave dell'identificatore.
- Costo :costo entrato in vigore il StartDate per la cronaca.
- Data di inizio :questa è la data in cui è entrato in vigore il costo per la registrazione.
- Data di fine :Questa è la data in cui il Costo nel verbale non è più efficace. Se il Costo è ancora valido, EndDate sarà impostato su 99991231. Questo per evitare un valore nullo in questo campo.
- Attuale :Y se il costo è ancora in vigore, N se non lo è.
La tabella di partenza ha già 3 record di cronologia. Sono quelli che hanno il valore N per il campo Corrente . La sorgente principale si chiama master2.dat e contiene i seguenti dati:
Codice prodotto | Costo | Data di inizio | EndDate | Attuale |
---|---|---|---|---|
C123 | 125,50 | 20110228 | 99991231 | S |
F112 | 2365.00 | 20120101 | 99991231 | S |
G101 | 19:25 | 20110930 | 99991231 | S |
G101 | 21:25 | 20110501 | 20110930 | N |
J245 | 450,50 | 20110430 | 99991231 | S |
J245 | 425,25 | 20101001 | 20110430 | N |
J245 | 385,25 | 20100215 | 20101001 | N |
S022 | 98,75 | 20110515 | 99991231 | S |
I record di aggiornamento hanno tutti la stessa StartDate . L'origine update.dat contiene record con i seguenti valori di campo:
Codice prodotto | Costo | Data di inizio |
---|---|---|
F112 | 2425,00 | 20120701 |
J245 | 550,50 | 20120701 |
M447 | 101,75 | 20120701 |
S022 | 101,75 | 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 le origini utilizzate per l'elaborazione dell'aggiornamento. Per il tipo 2, la destinazione è normalmente il file principale o la tabella originale.
Nella schermata successiva si determina come vengono mappati i dati di aggiornamento e come vengono impostati altri valori di campo o colonna. Il aggiornamento.Costo verrà mappato su Master2.cost e l'aggiornamento. Data di inizio verrà mappato su master2.StartDate . Il Campo Bandiera è il campo utilizzato per determinare il record con il Costo attivo. Ovvero, se i valori nel record sono attivi o storici. In questo caso, il Campo Flag è il campo Corrente . Il valore positivo segnalato è il valore in Corrente che determina se il Costo è il costo corrente; il valore è "Y" nel nostro esempio e il Valore negativo segnalato è "N". End Field contiene il nome del campo che contiene il valore utilizzato per determinare quando il Costo per il record non è più valido e Master.EndDate detiene quel valore. Valore finale viene utilizzato come valore per Fine campo quando il record contiene i valori correnti per un CodiceProdotto .
La schermata successiva serve per definire il join eseguito con il master e le sorgenti di aggiornamento. Tieni presente che entrambe le fonti devono essere ordinate rispetto a ProductCode . In caso contrario, devi selezionare NOT_SORTED nel menu a discesa per Opzione Ordina Ordine sotto l'origine dati che deve essere ordinata.
Ecco lo script del lavoro:
/INFILE=C:/IRI/CoSort95/workbench.orig/workspace/SCD/SCD2/master2.dat /PROCESS=DELIMITED /ALIAS=master2 /FIELD=(PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT, TYPE=ASCII, POSITION=5, 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=ASCII, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /JOIN FULL_OUTER master2 update WHERE MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE /OUTFILE=master2.dat # Include only records that are being updated # Use the Cost and StartDate from the Update file /PROCESS=DELIMITED /FIELD=(MASTER2.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='\"') /FIELD=(MASTER2.ENDDATE, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.CURRENT, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /INCLUDE WHERE MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE AND MASTER2.CURRENT EQ “Y" /OUTFILE=master2.dat # Change any current records that are being updated to history records # by giving the EndDate as the StartDate from the update record # and changing the field Current to N /PROCESS=DELIMITED /CONDITION=(MATCH, TEST=(MASTER2.PRODUCTCODE == UPDATE.PRODUCTCODE AND MASTER2.CURRENT EQ "Y")) /FIELD=(MASTER2.PRODUCTCODE, TYPE=ASCII, POSITION=1, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.COST, TYPE=NUMERIC, POSITION=2, SEPARATOR=",", FRAME='\"') /FIELD=(MASTER2.STARTDATE, TYPE=ASCII, POSITION=3, SEPARATOR=",", FRAME='\"') /FIELD=(ENDDATE_NEW, TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"', IF MATCH THEN UPDATE.STARTDATE ELSE MASTER2.ENDDATE) /FIELD=(CURRENT_NEW, TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"', IF MATCH THEN "N" ELSE MASTER2.CURRENT) /OMIT WHERE MASTER2.PRODUCTCODE EQ "" /OUTFILE=master2.dat # Add new records /PROCESS=DELIMITED /FIELD=(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='\"') /FIELD=(ENDDATE_NEW="99991231", TYPE=ASCII, POSITION=4, SEPARATOR=",", FRAME='\"') /FIELD=(CURRENT_NEW="Y", TYPE=ASCII, POSITION=5, SEPARATOR=",", FRAME='\"') /INCLUDE WHERE UPDATE.PRODUCTCODE NE "" AND MASTER2.PRODUCTCODE EQ ""
Il nuovo file master avrà questi valori:
Codice prodotto | Costo | Data di inizio | EndDate | Attuale |
---|---|---|---|---|
C123 | 125,50 | 20110228 | 99991231 | S |
F112 | 2425,00 | 20120701 | 99991231 | S |
F112 | 2365.00 | 20120101 | 20120701 | N |
G101 | 19:25 | 20110930 | 99991231 | S |
G101 | 21:25 | 20110501 | 20110930 | N |
J245 | 550,50 | 20120701 | 99991231 | S |
J245 | 450,50 | 20110430 | 20120701 | N |
J245 | 425,25 | 20101001 | 20110430 | N |
J245 | 385,25 | 20100215 | 20101001 | N |
M447 | 101,75 | 20120701 | 99991231 | S |
S022 | 101,75 | 20120701 | 99991231 | S |
S022 | 98,75 | 20110515 | 20120701 | N |