📚 Qlik Sense Kurs – Artikel 19 von 28
← Vorheriger Artikel: Flag-basierte Modellierung
→ Nächster Artikel: Error Handling
Was ist ein Data Quality Framework? Ein systematischer Ansatz zur Validierung von Datenqualität auf JEDER Ebene des ETL-Prozesses – von Staging über Transform bis zum finalen Datenmodell. Durch frühzeitige Kontrollen minimieren Sie den Aufwand für spätere Fehlerbereinigung.
Was lernst Du über das Data Quality Framework – Quality Gates in Qlik?
Nach diesem Guide kannst Du:
- Quality Gates auf allen ETL-Layern implementieren und automatisieren.
- Quality Flags für automatische Datenvalidierung und für **performante** Analysen nutzen. (Thema des letzten Artikels)
- Ein Quality Dashboard für transparentes Monitoring aufbauen.
- Kritische Fehler mithilfe von Thresholds und Variablen erkennen.
Zeitinvestment: 25 Min Lesen + 4 Std Hands-on
Quick Win: In 20 Minuten hast Du erste Quality Checks implementiert
Wie funktionieren Quality Gates auf jeder Ebene im Data Quality Framework?
Das Problem: Fehlerhafte Daten verbreiten sich unbemerkt durch alle Schichten und verfälschen Business-Entscheidungen! Die Behebung eines Fehlers in der Applikation ist 10x teurer als die Behebung des Fehlers im Ladeskript.
Die Lösung: Quality Gates nach JEDEM Verarbeitungsschritt – frühzeitig Probleme erkennen und beheben! Dieses dreistufige Modell ist die Basis für alle robusten Qlik-Architekturen.
Die drei Validierungs-Layer:
| Layer | Zweck der Validierung | Beispiele |
|---|---|---|
| 1. Staging | Strukturelle Integrität des Imports | Datei geladen? Row Count? Datentypen? (Primär: Daten laden) |
| 2. Transform | Einhaltung der Business Rules | Pflichtfelder? Werte valide? Duplikate? |
| 3. Model | Beziehungen & Modell-Hygiene | Keine Synthetic Keys? Referentielle Integrität? |
Was sind die 6 Data Quality Dimensionen?
Datenqualität lässt sich in sechs messbare Dimensionen aufteilen – im Qlik-Skript repräsentiert jede Dimension eine Gruppe von `If()`-Checks und Flags.
Wie wird die Vollständigkeit im Data Quality Framework in Qlik bewertet?
Sind alle erwarteten Daten vorhanden (keine NULL-Werte in Pflichtfeldern)?
// Prüfung: Pflichtfelder befüllt?
If(IsNull(CustomerID) OR Len(Trim(CustomerID)) = 0, 1, 0) as DQ_MissingCustomerID
Wie wird die Genauigkeit im Data Quality Framework in Qlik sichergestellt?
Sind die Werte korrekt und in gültigen Ranges (Widerspruch zur Realität)?
// Prüfung: Amount in vernünftigem Bereich?
If(Amount <= 0 OR Amount > 1000000, 1, 0) as DQ_InvalidAmount
Wie wichtig ist Konsistenz im Data Quality Framework für Qlik?
Sind Werte über verschiedene Felder hinweg logisch konsistent (z.B. Summen stimmen überein)?
// Prüfung: ShipDate nicht vor OrderDate?
If(ShipDate < OrderDate, 1, 0) as DQ_InvalidDateOrder
Was ist die Gültigkeit im Data Quality Framework in Qlik?
Entsprechen Werte dem erwarteten Format (z.B. numerisch, Datum, definierte Liste)?
// Prüfung: Email enthält @ und.?
If(NOT Match(Email, '*@*.*'), 1, 0) as DQ_InvalidEmail
Was ist Eindeutigkeit im Data Quality Framework in Qlik?
Sind Primary Keys wirklich eindeutig und keine Duplikate vorhanden?
// Prüfung: Duplikate nach OrderID? (Wird mit GROUP BY im Skript geprüft)
Count(*) as DuplicateCount
GROUP BY OrderID
HAVING Count(*) > 1
Wie wichtig ist die Timeliness (Aktualität) im Data Quality Framework?
Sind die Daten aktuell genug für die Analyse (z.B. Load-Datum vs. Heute)?
// Prüfung: Letzte Aktualisierung vor mehr als 24h?
If(Today() - LoadDate > 1, 1, 0) as DQ_DataStale
Was ist Layer 1: Staging – Strukturelle Validierung im Data Quality Framework?
Im Staging Layer, direkt nach dem Laden der Rohdaten, prüfst Du die grundlegende Integrität des Imports.
// Rohdaten laden
STG_Sales:
LOAD
OrderID,
CustomerID,
ProductID,
OrderDate,
Amount,
Quantity
FROM
(ooxml, embedded labels);
// Quality Check 1: Wurde die Datei überhaupt geladen?
LET vRowCount = NoOfRows('STG_Sales');
TRACE [QC] Staging: Loaded $(vRowCount) rows;
IF $(vRowCount) = 0 THEN
TRACE Staging: No data loaded! Stoppe das Script.
SET vQuality_Staging = 'FAIL';
EXIT SCRIPT;
ELSE
SET vQuality_Staging = 'PASS';
ENDIF
Erklärung:
- NoOfRows(): Zählt Records in der geladenen Tabelle.
- EXIT SCRIPT: Stoppt bei kritischem Fehler (z.B. keine Daten geladen) – dies ist Teil des Error Handling.
Wie überprüfe ich den Row Count Range in Qlik?
Prüfe, ob die Anzahl Records im erwarteten Bereich liegt, um Exportfehler oder Datenkorruption frühzeitig zu erkennen.
// Erwarteter Bereich definieren
LET vExpectedMin = 1000;
LET vExpectedMax = 1000000;
IF $(vRowCount) < $(vExpectedMin) OR $(vRowCount) > $(vExpectedMax) THEN
TRACE Staging: Row count outside expected range! Überprüfen Sie den Export.;
SET vQuality_Staging_RowCount = 'WARN';
ELSE
SET vQuality_Staging_RowCount = 'PASS';
ENDIF
Wie funktioniert die Datentyp-Validierung im Data Quality Framework in Qlik?
Die Datentyp-Validierung ist essenziell. Wenn eine Spalte, die numerisch sein sollte (z.B. `Amount`), als Text geladen wird, schlagen alle Aggregationen später fehl.
// Prüfe Datentypen
Temp_DataTypeCheck:
LOAD
Count(*) as TotalRows,
Sum(If(NOT IsNum(Amount), 1, 0)) as AmountNotNumeric,
Sum(If(NOT IsNum(Quantity), 1, 0)) as QuantityNotNumeric
RESIDENT STG_Sales;
LET vAmountNotNumeric = Peek('AmountNotNumeric', 0, 'Temp_DataTypeCheck');
TRACE [QC] Staging: Amount NOT numeric in $(vAmountNotNumeric) rows;
DROP TABLE Temp_DataTypeCheck;
Erklärung: `IsNum()` prüft ob der Wert numerisch ist. Wenn `AmountNotNumeric` größer als 0 ist, müssen Sie die Ladeanweisung korrigieren.
Wie funktionieren die Business Rules & Quality Flags in Layer 2: Transform?
Im Transform Layer validierst Du die Logik und erstellst die eigentlichen **Quality Flags**. Das ist die performanteste Methode zur Fehlerkennzeichnung (siehe Flag-basierte Modellierung).
TRF_Sales:
LOAD
OrderID,
CustomerID,
ProductID,
Date(OrderDate) as OrderDate,
Amount,
Quantity,
// Quality Flags - Completeness
If(IsNull(CustomerID) OR Len(Trim(CustomerID)) = 0, 1, 0)
as DQ_MissingCustomerID,
If(IsNull(ProductID) OR Len(Trim(ProductID)) = 0, 1, 0)
as DQ_MissingProductID,
// Quality Flags - Range Validation
If(Amount <= 0, 1, 0) as DQ_ZeroOrNegativeAmount,
If(Quantity <= 0, 1, 0) as DQ_InvalidQuantity,
// Quality Flags - Consistency
If(OrderDate > Today(), 1, 0) as DQ_FutureOrderDate,
// Composite Quality Flag: Markiert jeden fehlerhaften Record
If(IsNull(CustomerID) OR Amount <= 0 OR OrderDate > Today() OR Quantity <= 0,
1, 0) as DQ_HasAnyIssue
FROM (qvd);
Vorteile der Quality Flags: Anstatt fehlerhafte Records zu löschen, markieren Sie sie. So können Business-User später **im Frontend** mit Set Analysis (z.B. `Sum({<DQ_HasAnyIssue={‚0‘}>} Sales)`) ausschließlich die «guten» Daten analysieren, während die fehlerhaften Records für die Ursachenanalyse (Error Debugging) erhalten bleiben.
Wie berechnet man die Quality Summary in Qlik?
Fassen Sie die Fehlerzählungen zusammen, um den Zustand der Daten zu überwachen.
Quality_Transform:
LOAD
'TRF_Sales' as TableName,
Count(*) as TotalRecords,
Sum(DQ_HasAnyIssue) as RecordsWithIssues,
1 - (Sum(DQ_HasAnyIssue) / Count(*)) as QualityScore
RESIDENT TRF_Sales;
// Quality Score loggen
LET vQualityScore = Peek('QualityScore', 0, 'Quality_Transform');
TRACE [QC] Transform: Quality Score = $(vQualityScore);
// Threshold Check
IF $(vQualityScore) < 0.95 THEN
TRACE Transform: Quality Score below 95% threshold!
SET vQuality_Transform = 'ALERT';
ELSE
SET vQuality_Transform = 'PASS';
ENDIF
Erklärung: `QualityScore` ist 1 minus der Fehlerrate, wodurch Sie einen Prozentsatz «guter» Records erhalten. Bei Unterschreiten des definierten `Threshold` (hier 95%) wird ein **ALERT** ausgelöst.
Was ist Layer 3: Modell – Referentielle Integrität im Data Quality Framework?
Im finalen Modell muss die Beziehung zwischen Fact- und Dimensionstabellen geprüft werden. Hier geht es primär um die Vermeidung von *Orphaned Records* (Waisen). Dies hängt eng mit der Vermeidung von Synthetic Keys zusammen.
// Dimensionen laden
Dim_Customer:
LOAD CustomerID, CustomerName
FROM (qvd);
// Facts mit Referential Integrity Check
TRF_Sales:
LOAD
OrderID,
CustomerID,
ProductID,
Amount,
// Existiert CustomerID in Dim_Customer?
If(NOT Exists(CustomerID, CustomerID), 1, 0) as DQ_OrphanedCustomer,
// Existiert ProductID in Dim_Product?
If(NOT Exists(ProductID, ProductID), 1, 0) as DQ_OrphanedProduct
FROM (qvd);
Erklärung:
- Exists(Field, Value): Prüft, ob der Wert von `CustomerID` in der aktuell geladenen Tabelle bereits im Feld `CustomerID` der Tabelle `Dim_Customer` (der geladenen Dimension) existiert.
- DQ_OrphanedCustomer: 1 wenn die `CustomerID` in der Sales-Tabelle existiert, aber **kein** passendes Gegenstück in der Dimension gefunden wird.
Warum wichtig? Orphaned Records verursachen NULL-Verknüpfungen, was zu fehlenden Werten in Ihren Dimensionen und **falschen Aggregationen** führen kann.
Wie funktioniert die Duplikat-Erkennung im Data Quality Framework in Qlik?
Duplikate sind eine der häufigsten Ursachen für unzuverlässige Kennzahlen. Identifizieren Sie diese, bevor Sie die Daten weiter verarbeiten.
// Duplikate identifizieren (nach OrderID)
Temp_DuplicateCheck:
LOAD
OrderID,
Count(*) as DuplicateCount
RESIDENT STG_Sales
GROUP BY OrderID;
// Duplikat-Flag hinzufügen
LEFT JOIN (STG_Sales)
LOAD
OrderID,
If(DuplicateCount > 1, 1, 0) as DQ_IsDuplicate,
DuplicateCount
RESIDENT Temp_DuplicateCheck;
// Duplikat-Flag im Log speichern
LET vDuplicateCount = Sum(If(DQ_IsDuplicate = 1, 1, 0), 'STG_Sales');
TRACE [QC] Duplicates: Found $(vDuplicateCount) duplicate records;
Wie funktioniert die Deduplication Strategy im Data Quality Framework von Qlik?
Wählen Sie eine Strategie: Die besten Ergebnisse erzielen Sie, wenn Sie den «neuesten» oder «richtigsten» Record behalten:
// Strategie 2: Neuesten Record behalten (WICHTIGSTE STRATEGIE)
TRF_Sales_Latest:
LOAD *
RESIDENT STG_Sales
// Behalte alle Nicht-Duplikate UND nur den neuesten Duplikat-Record
WHERE DQ_IsDuplicate = 0
OR RecNo() = FirstSortedValue(RecNo(), -OrderDate, OrderID);
Erklärung: Diese erweiterte Logik behält alle eindeutigen Records bei und wählt bei Duplikaten nur den Record mit dem spätesten `OrderDate` (bzw. der höchsten `SourceRowNumber`, falls `OrderDate` nicht eindeutig ist). Diese Art der Daten-Transformation ist bei Rechnungen und Orders essenziell.
Was ist Cross-Field Validation im Data Quality Framework von Qlik?
Nutzen Sie die Konsistenzprüfung, um logische Fehler zwischen verknüpften Feldern aufzudecken.
TRF_Orders:
LOAD
OrderID,
Date(OrderDate) as OrderDate,
Date(ShipDate) as ShipDate,
TotalAmount,
// Cross-Field Consistency Flags
If(ShipDate < OrderDate, 1, 0) as DQ_ShipBeforeOrder,
If(Abs(TotalAmount - (OrderAmount + ShippingCost)) > 0.01, 1, 0)
as DQ_TotalMismatch,
//... weitere Checks
FROM (qvd);
Wie integriere ich das Quality Dashboard und richte Alerting ein?
Sammle Quality Metrics über Zeit (Historisierung) und nutze Qlik, um bei Problemen automatisch zu reagieren.
// Aktuelle Load Quality zusammenfassen und historisieren
//... (Zusammenfassungslogik wie im Originaltext)...
// An historischen Log anhängen
CONCATENATE(Quality_History)
LOAD * RESIDENT Quality_Summary;
// Speichern der historischen Daten
STORE Quality_History INTO (qvd);
Wie funktioniert automatisiertes Alerting mit Schwellenwerten in Qlik?
Wir nutzen den berechneten `vQualityScore` aus Layer 2, um eine automatisierte Benachrichtigung zu senden, falls die Qualität unter einen Schwellenwert fällt.
// Thresholds definieren
LET vQualityThreshold = 0.95; // 95% quality required
// Quality Score berechnen
//... (Logic to calculate vQualityScore)...
// Alert Logic
IF $(vQualityScore) < $(vQualityThreshold) THEN
TRACE Quality Score $(vQualityScore) below threshold!
// Automatisierte Aktion auslösen
// Hier kann z.B. Qlik Automate eine E-Mail versenden:
// EXECUTE;
TRACE Siehe Qlik Automate Email Benachrichtigungen für die Einrichtung.
ENDIF
Was sind die Best Practices für das Data Quality Framework in Qlik?
Die folgenden Best Practices stellen sicher, dass Ihr Framework effizient und wartbar bleibt.
✓ Layered Validation:
- [ ] Staging Layer: Strukturelle Checks (File loaded? Row count?)
- [ ] Transform Layer: Business Rules (Pflichtfelder? Ranges?)
- [ ] Model Layer: Relationships (Datenmodell-Probleme, No Orphans?)
✓ Quality Flags:
- [ ] Fehlerhafte Records markieren, NICHT löschen
- [ ] Klare Naming Convention (DQ_ Präfix)
- [ ] Composite Flags für «HasAnyIssue»
✓ Quality Logging & Performance:
- [ ] Quality Metrics in QVD speichern (historische Daten)
- [ ] Quality Dashboard für Monitoring
- [ ] Vor kritischen Checks Performance-Strategien anwenden
Wie beeinflusst die Performance die Qualität in Qlik’s Data Quality Framework?
Quality Checks haben einen Performance-Overhead (ca. +11% bis +55% zusätzliche Ladezeit) – aber die Kosten für *fehlerhafte* Business-Entscheidungen übersteigen diesen Aufwand bei Weitem. Es ist ein notwendiger Trade-off.
| Szenario | Load Time (1M Records) | Overhead |
|---|---|---|
| Ohne Quality Checks | 45 Sek | – |
| Mit Staging Checks | 50 Sek | +11% |
| Mit Transform Checks | 57 Sek | +27% |
| Mit All Checks | 70 Sek | +55% |
Fazit: +55% Load Time, aber dafür 100% Sicherheit über Datenqualität – ein guter Trade-off! Versuchen Sie, die Checks im Idealfall auf dem Transform Layer zu halten, um die Staging-Performance so schnell wie möglich zu halten.
Wie behebe ich Probleme im Data Quality Framework – Quality Gates in Qlik?
⚠️ Problem: Quality Checks verlangsamen Load zu stark
Lösung 1: Selective Checks
Prüfe nicht ALLE Records, sondern ein Sample:
// 10% Sample für schnelle Checks
WHERE Rand() < 0.1
Lösung 2: Parallele Verarbeitung
Nutze separate QVDs für Quality Checks – lade Haupt-Daten parallel:
// Main Load
STORE TRF_Sales INTO (qvd);
// Quality Checks in separatem Job
// Laden TRF_Sales.qvd und führe Checks aus
⚠️ Problem: Zu viele Quality Flags machen Modell unübersichtlich
Lösung: Composite Flags
Kombiniere mehrere Checks in einem Flag:
If(DQ_MissingCustomerID = 1 OR
DQ_ZeroOrNegativeAmount = 1 OR
DQ_FutureOrderDate = 1,
1, 0) as DQ_HasAnyIssue
⚠️ Problem: Quality Alerts feuern zu häufig
Lösung: Realistische Thresholds
100% Quality ist unrealistisch – setze praktische Thresholds:
// Nur Alert bei echter Verschlechterung
IF $(vQualityScore) < 0.95 THEN
// Alert
ENDIF
Was sind die nächsten Schritte im Data Quality Framework – Quality Gates in Qlik?
Du kannst jetzt systematische Data Quality Gates implementieren! Als nächstes:
1. Fehler-Behandlung: Was passiert, wenn Quality Checks fehlschlagen und das Skript stoppen soll? Error Handling zeigt Dir, wie Du kritische Fehler abfängst und das Skript kontrolliert beendest.
2. Performance-Steigerung: Um den Performance-Overhead zu minimieren, musst Du die Ladezeiten Deiner Applikationen weiter optimieren.
Welche verwandten Themen gibt es im Kurs zum Data Quality Framework?
- Error Handling – Was tun wenn Quality Checks fehlschlagen?
- Flag-based Modeling – Flags für ultimative Performance und einfache Set Analysis