Business Intelligence/5. September 2024 -Aktualisiert am 10. September 2024/5 Min. Lesezeit

Dataform: Assertions für die Qualitätskontrolle der Daten

Assertions in Dataform: Ein praktisches Werkzeug zur Qualitätskontrolle

In der modernen Datenverarbeitung sind Datenqualität und -integrität entscheidende Faktoren für den Erfolg von Datenprojekten. Um sicherzustellen, dass Daten den erforderlichen Standards entsprechen, werden verschiedene Methoden der Qualitätskontrolle eingesetzt. Eine dieser Methoden ist die Verwendung von Assertions in Dataform. Zu den Grundlagen von Dataform und wie man es benutzt haben wir in unseren früheren Blogartikeln zu dem Thema schon etwas geschrieben: Dataform: effizientes Datenmanagement und Dataform: Executions und Schedules.

Was sind Assertions?

Assertions in Dataform sind Bedingungen oder Regeln, die auf Daten angewendet werden, um sicherzustellen, dass sie bestimmten Kriterien entsprechen. Sie dienen als Prüfungen, die regelmäßig durchgeführt werden, um Anomalien oder Fehler in den Daten frühzeitig zu erkennen. Assertions können auf verschiedene Aspekte der Daten angewendet werden, wie zum Beispiel:

  • Datenintegrität: Überprüfen, ob Werte in einer Spalte den erwarteten Datentyp haben oder innerhalb eines bestimmten Bereichs liegen.
  • Referentielle Integrität: Sicherstellen, dass Fremdschlüsselbeziehungen zwischen Tabellen korrekt sind.

Geschäftsregeln: Validierung von Daten gegen spezifische Geschäftsregeln, wie z.B. das Überprüfen, ob Transaktionsbeträge positiv sind.

Implementierung von Assertions in Dataform

Grundsätzlich können Assertions in Dataform an zwei Stellen definiert werden:

  1. Direkt im Config Block einer Tabelle
  2. Oder als einzelnes .sqlx File

Für beide Szenarien folgt hier ein kurzes Beispiel. Im Folgenden wollen wir für die wichtigen ID-Spalten einer User Tabelle festlegen, dass diese nicht den Wert null annehmen dürfen. Außerdem geben wir an, dass jede row eine eindeutige user_id besitzen soll:

1config {
2  type: "table",
3  assertions: {
4    nonNull: ["user_id", "customer_id", "email"],
5    uniqueKey: ["user_id"]
6  }
7}
8SELECT ...
mysql

Mit dem 'uniqueKeys' Keyword kann hier auch eine Liste an Keys angegeben werden, die dann zusammen eindeutig sein müssen.

Eine weitere Möglichkeit ist es, die einzelnen Zeilen mit einer Custom Logic gegenzuprüfen. Dazu werden rowConditions eingesetzt:

1config {
2  type: "incremental",
3  assertions: {
4    rowConditions: [
5      'signup_date is null or signup_date > "2023-08-01"',
6      'email like "%@%.%"'
7    ]
8  }
9}
10
11SELECT ...
mysql

Diese werden dann gegen jede Zeile geprüft. Diese Prüfungen werden jedes Mal ausgeführt, wenn der SQL Workflow ausgeführt wird. Kommt es bei der Überprüfung zu Fehlern, werden diese im Execution Log aufgeführt.

Assertions können auch in eigenen .sqlx Files definiert werden. Ihr type ist dabei immer “assertion” und es macht ggf. Sinn diese in einem gesonderten Ordner zu sammeln. Assertions, die so definiert werden schlagen immer dann Alarm wenn sie ein Resultat zurückliefern:

1config {
2  type: "assertion",
3  description: "Stellt sicher, dass alle Transaktionsbeträge positiv sind."
4}
5SELECT *
6FROM ${ref("transactions")}
7WHERE amount < 0
8
mysql

Diese Assertion überprüft, ob es Transaktionen mit negativen Beträgen gibt. Falls solche Transaktionen gefunden werden, schlägt die Assertion fehl und die entsprechende Warnung wird ausgelöst.

Verkettung von Assertions

Häufig bauen in größeren Dataform-Projekten Tabellen und Definitionen aufeinander auf. Wenn Tabelle A auf Daten aus Tabellen B und C basiert, wollen wir sichergehen, dass A nur dann mit den neuen Werten aktualisiert wird, wenn die entsprechenden Assertions auf Tabelle B und C erfolgreich waren. Dazu kann man entweder gezielte Assertions referenzieren oder gleich die Tabelle als abhängig von allen vorangegangenen Assertions setzen:

1config {
2  type: "tableA",
3  dependOnDependencyAssertions: true
4}
5SELECT * FROM ${ref("tableB")}
6UNION ALL 
7SELECT * FROM ${ref("tableC")}
mysql

So kann verhindert werden, dass fehlerhafte Daten durch verschiedene Tabellen propagieren.

Vorteile der Verwendung von Assertions

  1. Früherkennung von Fehlern: Assertions ermöglichen es, Datenprobleme frühzeitig im ETL-Prozess (Extract, Transform, Load) zu erkennen und zu beheben, bevor sie sich auf nachgelagerte Analysen auswirken.
  2. Automatisierung der Qualitätskontrolle: Da Assertions regelmäßig und automatisch ausgeführt werden, reduzieren sie den manuellen Aufwand für Datenüberprüfungen und erhöhen die Effizienz.
  3. Transparenz und Nachvollziehbarkeit: Durch die klare Definition von Qualitätsregeln wird die Datenqualität transparent und nachvollziehbar, was insbesondere in regulierten Branchen von Vorteil ist.

Best Practices für den Einsatz von Assertions

  • Gezielte Assertions: Da Assertions häufig ausgeführt werden, sollte der Fokus auf kritischen Datenbereichen liegen, die wesentliche Auswirkungen auf die Geschäftsprozesse haben.
  • Regelmäßige Überprüfungen: Sind Assertions als fester Bestandteil in der Datenpipeline integriert, wird die Qualität der Daten automatisiert überprüft und eine kontinuierliche Überwachung ist gewährleistet.
  • Dokumentation und Wartung: Im Code sind alle Assertions dokumentiert, doch können diese auch in den descriptions der Columns Einzug finden. Assertions sollten auch regelmäßig aktualisiert werden, um sicherzustellen, dass sie immer den aktuellen Geschäftsanforderungen entsprechen.

Fazit

Assertions in Dataform sind ein mächtiges Werkzeug, um die Datenqualität und -integrität in Datenpipelines zu gewährleisten. Durch den gezielten Einsatz von Assertions können Unternehmen sicherstellen, dass ihre Daten verlässlich und präzise sind, was die Grundlage für fundierte Entscheidungen bildet.

Hilfreiche Links: