Lees ons artikel over

class="lazyload

.

In hun dagelijkse werkzaamheden moeten Data Engineers en Data Analisten de opnameprocessen van data verbeteren. Naast de gebruikelijke eenheidstests kan het interessant zijn om twee datasets (d.w.z. tabellen, views, queries, enz.) eenvoudig en snel te vergelijken voor verschillende doeleinden, zoals impactanalyse of non-regressietests. Ook het identificeren van discrepanties tussen twee gezichtspunten van een snapshot tabel is erg nuttig voor adhoc analyse of debugging.

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:

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 stellen we twee soortgelijke queries samen 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 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 die in aanmerking komen voor een promotie in één tabel wil ophalen volgens de actievoorwaarden van de week.

In eerste instantie beschouwen we onderstaande producten als op voorraad:

Volgens de promotievoorwaarden in week 1:

  • 10% korting op fruit, groenten en kruiden schappen

de dataset_1 is:

In week 2 evolueren de promotievoorwaarden naar:

  • 10% korting op fruit en ijsplanken

  • 20% korting op groenteschap

  • geen korting op kruidenrek

De evolutie van de data pijplijn genereert de dataset_2:

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 eenvoudig om de bovenstaande vragen intuïtief te beantwoorden door een triviaal voorbeeld op een kleine dataset, in echte gebruikssituaties 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:

Opmerkingen:

  • Geen rij met producten uit het fruitschap: prima want de "10% korting op fruit" is ongewijzigd gebleven van week 1 naar week 2

  • Product_ID #50 (kruiden schap) ontbreekt in dataset_2 (alleen in dataset_1): prima want de "korting op kruiden" is gestopt in week 2

  • Product_ID #60 (ijsjes schap) ontbreekt in dataset_1 (alleen in dataset_2): prima want de "korting op ijsjes" werd geïntroduceerd in week 2

  • Rijen betreffende Product_ID #30 en #40 (groenten schap) wijken af op reduced_price veld: prima aangezien 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 een goed idee zijn om de resultaten in tijdelijke tabellen op te slaan, zelfs als u uw ingestion SQL query voor/na evolutie kunt kopiëren-plakken, 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 kan het sorteren van resultaten op sleutel (de granulariteit van de datasets) en vlag enorm helpen bij het interpreteren en vergelijken van gelijkwaardige rijen uit beide datasets.

Om het onderzoek te vergemakkelijken en de oorsprong van het gat te identificeren, kunnen de gemeenschappelijke velden van de verdachte datasets uit de vergelijking worden verwijderd (d.w.z. becommentarieerd in CTE): 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 dat zou veel moeilijker te onderhouden zijn geweest (beheer van NULL's en 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 handig als aanvulling op meer traditionele unit tests en kan zelfs op een meer algemene manier worden gebruikt bij het vergelijken van twee datasets met vergelijkbare structuren. En last but not least: de logica van deze query is zelfs eenvoudig uit je hoofd te leren!

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

class="lazyload

Medium Blog door Artefact.

Dit artikel is oorspronkelijk gepubliceerd op Medium.com.
Volg ons op onze Medium Blog !