Lees ons artikel over

.

In hun dagelijkse werkzaamheden moeten Data Engineer's en Data Analisten data ingestion processen verbeteren. Naast de gebruikelijke unit tests, kan het interessant zijn om eenvoudig en snel twee datasets (d.w.z. tabellen, views, queries, etc) te vergelijken voor verschillende doeleinden, zoals impact analyse of non-regressie testen. Ook het identificeren van discrepanties tussen twee gezichtspunten van een snapshot-tabel is erg nuttig voor ad-hocanalyse of debuggen.

Met dit in gedachten en voor SQL-beoefenaars is een kant-en-klaar en herbruikbaar script zinvol, vandaar het doel van dit artikel.

Gebruiksklare SQL-sjabloon uitgelegd

Laten we naar de kern van de zaak gaan met de verwachte vraag:

Image

Laten we het nu uitleggen:

  • Eerst gebruiken we CTE - Common Table Expressions (WITH ... ASstatements) om de twee te vergelijken datasets te identificeren. Hierdoor kunnen de volgende queryregels ongewijzigd blijven.

  • Vervolgens construeren we twee vergelijkbare queries met de alias dataset_1_only en dataset_2_only om rijen te behouden die alleen aanwezig zijn in dataset 1 (vergeleken met dataset 2) en vice versa dankzij de EXCEPT set operator.

  • Tot slot wordt er een aanvullend vlagveld gedefinieerd om de bron van niet overeenkomende rijen uit beide query's te identificeren. Deze worden dan verzameld via de UNION ALL set operator.

Opmerking: uiteraard is het hebben van twee datasets met vergelijkbare velden een voorwaarde om de bovenstaande query te kunnen gebruiken.

Geïllustreerd voorbeeld

Genoeg theorie, nu de praktijk! Stel dat een supermarkt alle producten ophalen die in aanmerking komen voor een promotie in een enkele tabel volgens de week promotievoorwaarden.

In eerste instantie beschouwen we onderstaande producten als op voorraad:

Image

Volgens de promotievoorwaarden in week 1:

  • 10% korting op fruit, groenten en kruiden schappen

de dataset_1 is:

Image

In week 2 evolueren de promotievoorwaarden naar:

  • 10% korting op fruit en ijsjes schappen

  • 20% korting op groenten schap

  • geen korting op kruidenrek

De evolutie van de data pijplijn genereert de dataset_2:

Image

Maar... zijn we echt zeker van de resultaten? Typische vragen zijn:

  • Zijn er ontbrekende of extra rijen?

  • Zijn geïmplementeerde evoluties correct op beïnvloede velden?

  • Is er enige regressie op niet-beïnvloede velden?

Opmerking: ook al lijkt het gemakkelijk om de bovenstaande vragen intuïtief te beantwoorden dankzij een triviaal voorbeeld op een kleine dataset, in echte gebruiksgevallen hebben we meestal te maken met veel rijen en kolommen van complexe queries (transformaties, joins, aggregaten, windowsfuncties, ...) waardoor deze query zijn volledige betekenis krijgt.

Laten we proberen de 3 vragen te beantwoorden door de resultaten van de vergelijkende query te interpreteren:

Image

Opmerkingen:

  • Geen rij met producten uit het fruitschap: fijn als de “10% korting op fruit” is ongewijzigd gebleven van week 1 naar week 2

  • Product_ID #50 (kruidenrek) ontbreekt in dataset_2 (alleen in dataset_1): fijn als de “korting op kruiden” werd gestopt in week 2

  • Product_ID #60 (ijsplank) ontbreekt in dataset_1 (alleen in dataset_2): fijn als de “korting op ijsjes” werd geïntroduceerd in week 2

  • Rijen met Product_ID #30 en #40 (groenteschap) wijken af op het veld gereduceerde_prijs: fijn als de “korting op groenten” steeg van 10% in week 1 naar 20% in week 2

Eindelijk ziet alles er goed uit:

  • Zijn er ontbrekende of extra rijen? Nee!

  • Zijn geïmplementeerde evoluties correct op beïnvloede velden? Ja!

  • Is er enige regressie op niet-beïnvloede velden? Nee!

Tips en trucs

In CTE kan het, zelfs als u uw ingestion SQL-query voor/na evolutie kunt kopiëren-plakken, een goed idee zijn om de resultaten opslaan in tijdelijke tabellen om de vergelijking te vereenvoudigen, de queryprestaties te verbeteren en te profiteren van caching als u de query meerdere keren uitvoert.

In de echte wereld kunnen verschillen tussen twee datasets rommelig zijn. Dan, resultaten sorteren op sleutel (de granulariteit van de datasets) en vlag kan enorm helpen bij het interpreteren en vergelijken van gelijkwaardige rijen afkomstig van beide datasets.

Om het onderzoek te vergemakkelijken en de oorsprong van de kloof te identificeren, zijn de verdacht datasets algemene velden kan verwijderd worden (d.w.z. becommentarieerd in CTE) uit de vergelijking: als er geen resultaat is, betekent dit dat alle vergeleken velden gelijk zijn. U kunt zich dan bij de volgende vergelijking alleen richten op de resterende verdachte velden en deze stap voor stap uitvoeren.

Opmerking: een gelijkwaardige analyse had kunnen worden uitgevoerd met behulp van de LEFT JOIN-strategie, maar zou veel moeilijker te onderhouden zijn geweest (beheer van NULLs & veldenvergelijkingen) en minder efficiënt omdat setoperators krachtiger zijn dan joins.

Samenvatting

Deze gesjabloneerde query maakt het daarom eenvoudiger voor ontwikkelaars om snel wijzigingen op complexe data-pijplijnen te valideren. Het is nuttig als aanvulling op meer traditionele unit tests, en kan zelfs op een meer algemene manier gebruikt worden bij het vergelijken van twee datasets met vergelijkbare structuren. En last but not least, de logica van deze query is zelfs gemakkelijk uit het hoofd te leren!

Bedankt voor het lezen, ik hoop dat het duidelijk was en ik hoor graag uw feedback :)

Medium Blog bij Artefact.

Dit artikel werd oorspronkelijk gepubliceerd op Medium.com.
Volg ons op ons medium Blog !