{"id":11759,"date":"2025-08-26T10:14:09","date_gmt":"2025-08-26T09:14:09","guid":{"rendered":"https:\/\/sparkle.consulting\/?p=11759"},"modified":"2026-07-09T18:03:12","modified_gmt":"2026-07-09T17:03:12","slug":"declarative-data-pipelines-in-fabric-with-materialized-lake-views","status":"publish","type":"post","link":"https:\/\/sparkle.consulting\/nl\/declarative-data-pipelines-in-fabric-with-materialized-lake-views\/","title":{"rendered":"Declaratieve datapijplijnen in Fabric met Materialized Lake Views"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"11759\" class=\"elementor elementor-11759\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a861a6c elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a861a6c\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3f5912a\" data-id=\"3f5912a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e6632b0 elementor-widget elementor-widget-text-editor\" data-id=\"e6632b0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong>Waarom Materialized Lake Views?<\/strong><\/p><p>Data engineers besteden vaak te veel tijd aan het orchestreren van pijplijnen in plaats van aan het transformeren van data. De nieuwe Materialized Lake Views (MLV's) van Microsoft Fabric veranderen dat. Ze laten je transformaties in SQL declareren, en Fabric zorgt automatisch voor persistentie, refresh-scheduling, lineage, monitoring en zelfs datakwaliteitsvalidatie.<\/p><p>Microsoft beschrijft MLV's als declaratieve pijplijnen voor je Lakehouse: jij zegt <strong><em>wat<\/em><\/strong> je wilt, en Fabric regelt het <strong><em>hoe.<\/em><\/strong><\/p><p>In tegenstelling tot traditionele pijplijnen waar je zelf orchestratie, error handling en kwaliteitscontroles moet bouwen, integreren MLV's deze aspecten by design. Met eenvoudige SQL-constraints kun je datakwaliteitsregels afdwingen (ongeldige records droppen of de pijplijn stoppen bij overtredingen), en Fabric genereert automatisch rapporten en lineage-inzichten om ze te monitoren.<\/p><p>We onderzochten deze functionaliteit in detail en vergeleken ze met ons <a href=\"https:\/\/sparkle.consulting\/nl\/fabricignitepacks\/\"><strong>Fabric Ignite Framework<\/strong><\/a>, dat dbt gebruikt voor transformaties.<\/p><p>Beide benaderingen willen betrouwbare, analytics-ready data leveren, maar ze verschillen in setupinspanning, flexibiliteit en governancemodel.<\/p><p>Deze blog geeft een overzicht op hoofdlijnen van MLV's en hun vergelijking met dbt.<\/p><p>Voor wie onze stapsgewijze setup en technische testscenario's in detail wil volgen, hebben we de volledige technische documentatie beschikbaar gemaakt <a href=\"#usecase\"><img decoding=\"async\" class=\"\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/1f449.svg\" alt=\"\ud83d\udc49\" width=\"20\" height=\"20\" data-wp-editing=\"1\" \/><\/a>\u00a0<\/p><p><strong>Hoe werken MLV's?<\/strong><\/p><ul><li>Gedefinieerd met SQL in notebooks of de UI (PySpark-ondersteuning is gepland).<\/li><li>Resultaten worden opgeslagen als Delta-tabellen in OneLake, geoptimaliseerd voor Power BI Direct Lake.<\/li><li>Automatische lineage-tracking en dataflow-orchestratie: geen manuele pijplijnsetup nodig.<\/li><li>Ingebouwde datakwaliteitscontroles via constraints:<\/li><\/ul><p>ON MISMATCH FAIL: stopt de uitvoering van de pijplijn.<\/p><p>ON MISMATCH DROP: slaat ongeldige rijen over maar zet de uitvoering van de pijplijn voort.<br \/><img fetchpriority=\"high\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/create-MLV.png\" alt=\"\" width=\"519\" height=\"144\" \/><\/p><p><b>Voorbeeld: van Bronze naar Gold<\/b><\/p><p><span lang=\"EN-US\">Met de AdventureWorks-dataset implementeerden we een klassieke Medallion-architectuur met<br \/>MLV's<\/span><\/p><p><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in; font-family: Symbol;\">\u00b7<span style=\"font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-variant-emoji: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/span><\/span><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">Bronze:\u00a0<\/span><span style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">ruwe CSV's (sales, adressen, kredietkaarten, personen).\u00a0<\/span><\/p><p><span style=\"font-family: Symbol; font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">\u00b7<\/span><span style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-variant-emoji: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';\">\u00a0 \u00a0 \u00a0 \u00a0<\/span><span style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">Silver:\u00a0<\/span><span style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">opgeschoonde, verrijkte views, bv.<\/span><\/p><p style=\"margin-left: 35.4pt; text-indent: 35.4pt;\"><span lang=\"EN-US\">addresses voegt State- en Country-namen toe.<\/span><\/p><p style=\"margin-left: 35.4pt; text-indent: 35.4pt;\"><span lang=\"EN-US\">creditcards joint de naam van de houder uit de person-tabel.<\/span><\/p><p><span lang=\"EN-US\" style=\"font-size: 11.0pt; line-height: 107%; font-family: 'Aptos',sans-serif; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: Aptos; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-font-family: 'Times New Roman'; mso-bidi-theme-font: minor-bidi; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA;\"><span style=\"font-size: 16px; font-style: inherit; font-weight: inherit; font-family: Symbol; text-indent: -0.25in;\">\u00b7<\/span><span style=\"font-style: inherit; font-weight: inherit; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-variant-position: normal; font-variant-emoji: normal; text-indent: -0.25in; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';\">\u00a0 \u00a0 \u00a0 \u00a0<\/span>Gold: geaggregeerde orderheaders, die salesdata combineren met verrijkte adressen en kredietkaartinfo.<\/span><\/p><p><img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/bronze-to-gold-1024x1008.png\" alt=\"\" width=\"1024\" height=\"1008\" \/><\/p><p><b>Datakwaliteit monitoren\u00a0<\/b><\/p><p><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in; font-family: Symbol;\">\u00b7<span style=\"font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-variant-emoji: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><\/span><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">De lineage-view in Fabric toont de afhankelijkheden tussen MLV's en genereert een uitvoerbare pijplijn.\u00a0<\/span><\/p><p><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in; font-family: Symbol;\">\u00b7<span style=\"font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-variant-emoji: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><\/span><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">Refreshes zijn slim: als er geen brondata is gewijzigd, wordt de run overgeslagen. (Momenteel alleen full refresh; incremental refresh staat op de roadmap.)\u00a0<\/span><\/p><p><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in; font-family: Symbol;\">\u00b7<span style=\"font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; font-size-adjust: none; font-kerning: auto; font-optical-sizing: auto; font-feature-settings: normal; font-variation-settings: normal; font-variant-position: normal; font-variant-emoji: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: 'Times New Roman';\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/span><\/span><span lang=\"EN-US\" style=\"font-style: inherit; font-weight: inherit; text-indent: -0.25in;\">Ingebouwde monitoring via:<\/span><\/p><p style=\"margin-left: 35.4pt; text-indent: 35.4pt;\"><span lang=\"EN-US\">sys_dq_metrics-tabel: gedropte records, overtredingen per constraint.<\/span><\/p><p style=\"margin-left: 35.4pt; text-indent: 35.4pt;\"><span lang=\"EN-US\">Automatisch gegenereerde Data Quality Reports: overzicht en detail per MLV.<\/span><\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/dataquality.png\" alt=\"\" width=\"510\" height=\"285\" \/><\/p><p><strong>Voordelen van MLV's<\/strong><\/p><p>MLV's worden volledig aangemaakt, ofwel in de UI van Fabric, ofwel als een SQL-query in een Notebook. Fabric verzorgt alle backend-verwerking voor jou (refresh-logica, pijplijnbeheer op basis van afhankelijkheden tussen MLV's en hun bronnen, afhandeling van overtredingen van datakwaliteitsregels, scheduling, monitoring en rapportering).<\/p><p>Analisten en dataprofessionals hoeven alleen in een SQL-query te defini\u00ebren wat ze willen (transformaties, aggregaties, datakwaliteitsregels en -acties, enz.), zonder dat ze extra infrastructuur en\/of engineeringvaardigheden nodig hebben.<\/p><p>Ze passen volledig in het ecosysteem van Microsoft Fabric zonder manueel ontwikkelwerk en\/of een complexe setup te vereisen.<\/p><p>MLV's zijn gematerialiseerd, wat betekent dat hun inhoud fysiek is opgeslagen en veel sneller kan worden bevraagd dan standaard views. Een effici\u00ebnte refresh-logica (alleen MLV's met wijzigingen in de brondata worden vernieuwd) verlaagt de verwerkingstijd en de kosten van cloudresources. <em>(Opmerking: ondersteunt momenteel full refresh of geen refresh; incrementeel laden is gepland in toekomstige updates.)<\/em><\/p><p><strong>Beperkingen vandaag<\/strong><\/p><p>Dit is een eerste versie van MLV's; verschillende features staan nog op de roadmap voor toekomstige releases (zoals ondersteuning voor declaratieve syntax voor PySpark (waar momenteel alleen SQL kan worden gebruikt), incremental refresh-mogelijkheden, API-ondersteuning voor het beheren van MLV's, cross-lakehouse lineage- en uitvoeringsfeatures, enz.). Er gelden enkele beperkingen op het gebruik van functies en patroonzoekopdrachten met operators zoals LIKE of regex in constraint-condities.<\/p><p>Een lineage van opeenvolgende Materialized Lake Views is vereist om er zeker van te zijn dat de DataFlow\/pijplijn correct wordt gegenereerd; andere types transformaties worden niet in aanmerking genomen. Brontabellen moeten ook via een ander type transformatie worden geladen (en via een eigen pijplijn); het laden ervan maakt geen deel uit van de MLV-DataFlow\/schedule. Er bestaat slechts \u00e9\u00e9n MLV-DataFlow\/schedule, inclusief <u>alle<\/u> MLV's, zelfs als ze niet aan elkaar gerelateerd zijn. Er bestaat geen mogelijkheid om de MLV-DataFlow\/schedule op te splitsen in bijvoorbeeld Subject Areas.<\/p><p>Falende datakwaliteitscontroles resulteren in een van de volgende acties: ofwel de records met een falende datakwaliteitscontrole droppen, ofwel de uitvoering van de MLV en de daaropvolgende MLV's stoppen. Deze 2 types acties worden echter verschillend gemonitord (de MLV-runs in de lineage tonen alleen de falende uitvoering van de MLV's door DQ-fouten, terwijl de sys_dq_metrics-tabel alleen het aantal gedropte records tijdens een MLV-uitvoering toont), wat het moeilijker maakt om dit op te volgen.<\/p><p>Er is momenteel noch een testframework, noch Git-integratie beschikbaar.<\/p><p><strong>Vooruitblik<\/strong><\/p><p>Materialized Lake Views zijn nog jong, maar Microsoft ontwikkelt ze snel verder. Incremental refresh en PySpark-ondersteuning staan al op de roadmap. Diepere integratie met Purview, Git en API's ontbreekt momenteel.<\/p><p>Vandaag zijn MLV's al een uitstekende keuze voor de snelle levering van gecureerde datasets in Fabric, zeker in combinatie met Power BI Direct Lake.<\/p><p>Vooruitkijkend verwachten we dat MLV's nog krachtiger worden met mogelijkheden zoals:<\/p><ul><li>Slimmere incrementele verwerking<\/li><li>Rijkere ingebouwde datakwaliteit en testing<\/li><li>Volledige Git-gebaseerde samenwerking en CI\/CD-ondersteuning<\/li><li>Cross-lakehouse lineage voor enterprise data mesh<\/li><li>Performanceoptimalisaties met adaptieve refresh en caching<\/li><\/ul><p>Deze innovaties zullen MLV's tillen van een low-code-enabler naar een strategische enterprise-oplossing voor geavanceerde analytics engineering.<\/p><p><strong>Fabric Ignite Framework met dbt versus Fabric Materialized Lake Views<\/strong><\/p><p>In ons <a href=\"https:\/\/sparkle.consulting\/nl\/fabricignitepacks\/\">Fabric Ignite framework<\/a>, vertrouwen we op dbt voor het beheren van transformaties. dbt geeft ons geavanceerde testing, Git-gebaseerde workflows en volwassen incremental refresh-mogelijkheden: features waar data engineers van houden bij het bouwen van complexe, gegovernde pijplijnen.<\/p><p>Met de komst van Materialized Lake Views (MLV's) in Fabric zien we nu een aantrekkelijk alternatief voor bepaalde scenario's. MLV's blinken uit wanneer je snelle levering van gecureerde datasets, minimale setup en Fabric-native governance wilt, terwijl dbt sterker blijft voor incrementele modellen, geavanceerde testing en CI\/CD-best practices.<\/p><p>In de praktijk zullen veel organisaties waarschijnlijk beide benaderingen combineren: MLV's gebruiken voor low-code, Fabric-native workloads, en dbt inzetten waar engineeringcomplexiteit, portabiliteit en DevOps-praktijken essentieel zijn.<\/p><p>Vergelijking tussen MLV en dbt:<\/p><table><tbody><tr><td width=\"142\"><p><strong>Feature \/ behoefte<\/strong><\/p><\/td><td width=\"242\"><p><strong>Materialized Lake Views (MLV)<\/strong><\/p><\/td><td width=\"221\"><p><strong>dbt<\/strong><\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Setuptijd<\/strong><\/p><\/td><td width=\"242\"><p>Minuten, volledig in de Fabric-UI<\/p><\/td><td width=\"221\"><p>Vereist setup van dbt Core\/Cloud, Git-repo, configs<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Incremental refresh<\/strong><\/p><\/td><td width=\"242\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/274c.svg\" alt=\"\u274c\" \/>\u00a0(alleen full refresh, incrementeel gepland)<\/p><\/td><td width=\"221\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/2705.svg\" alt=\"\u2705\" \/>\u00a0Native incrementele modellen<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Governance-integratie<\/strong><\/p><\/td><td width=\"242\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/2705.svg\" alt=\"\u2705\" \/>\u00a0Volledige Fabric\/Purview lineage-monitoring<\/p><\/td><td width=\"221\"><p>Gedeeltelijk: vereist extra integratie<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Afhankelijkheidsbeheer<\/strong><\/p><\/td><td width=\"242\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/2705.svg\" alt=\"\u2705\" \/>\u00a0Auto-refresh op basis van lineage binnen Fabric<\/p><\/td><td width=\"221\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/2705.svg\" alt=\"\u2705\" \/>\u00a0Expliciete DAG via ref()<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Testframework<\/strong><\/p><\/td><td width=\"242\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/274c.svg\" alt=\"\u274c\" \/>\u00a0Niets ingebouwd<\/p><\/td><td width=\"221\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/2705.svg\" alt=\"\u2705\" \/>\u00a0Uitgebreide ingebouwde + custom tests<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Versiebeheer<\/strong><\/p><\/td><td width=\"242\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/274c.svg\" alt=\"\u274c\" \/>\u00a0Geen Git-integratie<\/p><\/td><td width=\"221\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/2705.svg\" alt=\"\u2705\" \/>\u00a0Git-native workflows<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Cross-platform<\/strong><\/p><\/td><td width=\"242\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/274c.svg\" alt=\"\u274c\" \/>\u00a0Alleen Fabric<\/p><\/td><td width=\"221\"><p><img decoding=\"async\" class=\"emoji\" role=\"img\" draggable=\"false\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/2705.svg\" alt=\"\u2705\" \/>\u00a0Veel warehouses + lakehouses ondersteund<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Leercurve<\/strong><\/p><\/td><td width=\"242\"><p>Laag (SQL-gericht)<\/p><\/td><td width=\"221\"><p>Hoger (YAML, Jinja, CLI, Git)<\/p><\/td><\/tr><tr><td width=\"142\"><p><strong>Best geschikt voor<\/strong><\/p><\/td><td width=\"242\"><p>Eenvoudige tot gemiddelde transformaties in Lakehouse, volledig door Fabric beheerd<\/p><\/td><td width=\"221\"><p>Complexe, ge\u00ebngineerde transformaties, CI\/CD, multi-platform<\/p><\/td><\/tr><\/tbody><\/table>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9212258 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"9212258\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-baefa18 elementor-widget elementor-widget-menu-anchor\" data-id=\"baefa18\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"menu-anchor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-menu-anchor\" id=\"usecase\"><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a03d456 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"a03d456\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><span style=\"font-style: inherit;\"><b>Use case<\/b><\/span><\/p><p><span style=\"font-style: inherit;\"><span style=\"font-weight: inherit;\">Er werd een use case opgezet volgens de medallion-architectuur door data in drie lagen te organiseren:<\/span><\/span><\/p><ul><li>bronze (ruwe data)<\/li><li>silver (opgeschoonde en verrijkte data)<\/li><li>gold (geaggregeerde en geanalyseerde data).<\/li><\/ul><p>Enkele tabellen uit het AdventureWorks 2008 OLTP-schema (een voorbeelddatabase voor Microsoft SQL Server) worden gebruikt als bron voor deze use case. Deze tabellen werden gedownload als CSV-bestanden en geladen als Delta Table in een <strong>Bronze<\/strong> -laag van Fabric:<\/p><table><tbody><tr><td width=\"205\"><p><strong>Tabel<\/strong><\/p><\/td><td width=\"205\"><p><strong>Beschrijving<\/strong><\/p><\/td><td width=\"205\"><p><strong>Delta Table in Bronze-laag Fabric<\/strong><\/p><\/td><\/tr><tr><td width=\"205\"><p>Sales.SalesOrderHeader<\/p><\/td><td width=\"205\"><p>Algemene informatie over verkooporders.<\/p><\/td><td width=\"205\"><p>adventureworks_bronze.salesorderheader<\/p><\/td><\/tr><tr><td width=\"205\"><p>Person.Address<\/p><\/td><td width=\"205\"><p>Straatadresinformatie voor klanten, werknemers en leveranciers.<\/p><\/td><td width=\"205\"><p>adventureworks_bronze.address<\/p><\/td><\/tr><tr><td width=\"205\"><p>Person.StateProvince<\/p><\/td><td width=\"205\"><p>Opzoektabel voor staten en provincies.<\/p><\/td><td width=\"205\"><p>adventureworks_bronze.stateprovince<\/p><\/td><\/tr><tr><td width=\"205\"><p>Person.CountryRegion<\/p><\/td><td width=\"205\"><p>Opzoektabel met de ISO-standaardcodes voor landen en regio's.<\/p><\/td><td width=\"205\"><p>adventureworks_bronze.countryregion<\/p><\/td><\/tr><tr><td width=\"205\"><p>Sales.CreditCard<\/p><\/td><td width=\"205\"><p>Kredietkaartinformatie van klanten.<\/p><\/td><td width=\"205\"><p>adventureworks_bronze.creditcard<\/p><\/td><\/tr><tr><td width=\"205\"><p>Sales.PersonCreditCard<\/p><\/td><td width=\"205\"><p>Kruisverwijzingstabel die personen koppelt aan hun kredietkaartinformatie in de CreditCard-tabel.<\/p><\/td><td width=\"205\"><p>adventureworks_bronze.personcreditcard<\/p><\/td><\/tr><tr><td width=\"205\"><p>Person.Person<\/p><\/td><td width=\"205\"><p>Personen die betrokken zijn bij AdventureWorks: werknemers, klantcontacten en leverancierscontacten.<\/p><\/td><td width=\"205\"><p>adventureworks_bronze.person<\/p><\/td><\/tr><\/tbody><\/table><p>Het datamodel van de Bronze-laag:<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-11770 size-full\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/bronzlayerdatamodel.png\" alt=\"\" width=\"605\" height=\"293\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/bronzlayerdatamodel.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/bronzlayerdatamodel-300x145.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p><em>Opmerking: de bovenstaande tabelrelaties werden aan het datamodel toegevoegd nadat de MLV's (zie volgende stappen) waren aangemaakt, om het datamodel visueler te maken. Ze zijn niet noodzakelijk en\/of worden niet door Fabric gebruikt om de MLV's op te zetten.<\/em><\/p><p>In de <strong>Silver<\/strong> -laag worden 2 verrijkte\/opgeschoonde tabellen opgezet. Ze worden aangemaakt als Materialized Lake Views:<\/p><ul><li><strong>addresses<\/strong> Alle adressen in de brontabel address worden verrijkt met de StateProvince Name en CountryRegion Name die uit de juiste brontabellen worden opgehaald.<\/li><li><strong>creditcards<\/strong>\u00a0<b>&#8211;<\/b> Alle kredietkaarten in de brontabel creditcard worden verrijkt met de naam van de kredietkaarthouder, afgeleid uit de brontabel persons.<\/li><\/ul><p>Om de ingebouwde datakwaliteitsmogelijkheden van MLV's te demonstreren, worden enkele constraints gedefinieerd:<\/p><ul><li><strong>addresses<\/strong> Alle adressen moeten een StateProvince Name en CountryRegion Name hebben. Als die niet uit de juiste brontabellen kunnen worden afgeleid, mag de MLV niet worden bijgewerkt en moet de pijplijn met een fout stoppen.<\/li><li><strong>creditcards\u00a0<\/strong>Alle kredietkaarten moeten een Number, Expiry Month en Expiry Year hebben. Als die niet uit de juiste brontabel kunnen worden afgeleid, mogen deze kredietkaarten niet in de MLV worden opgenomen, maar kan de uitvoering van de pijplijn doorgaan.<\/li><\/ul><p>Aanmaakscripts voor de MLV's in de Silver-laag in Fabric:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4245b3a elementor-widget elementor-widget-code-highlight\" data-id=\"4245b3a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>CREATE MATERIALIZED LAKE VIEW IF NOT EXISTS adventureworks_silver.addresses\r\n               (\r\n     CONSTRAINT stateprovince_chk CHECK (StateProvince IS NOT NULL) ON MISMATCH FAIL,\r\n     CONSTRAINT countryregion_chk CHECK (CountryRegion IS NOT NULL) ON MISMATCH FAIL\r\n               )\r\n             AS\r\n         SELECT ad.AddressID,\r\n                ad.AddressLine1,\r\n                ad.AddressLine2,\r\n                ad.City,\r\n                ad.PostalCode,\r\n                sp.Name StateProvince,\r\n                cr.Name CountryRegion\r\n           FROM adventureworks_bronze.address          ad \r\nLEFT OUTER JOIN adventureworks_bronze.stateprovince    sp \r\n             ON ad.StateProvinceID = sp.StateProvinceID\r\nLEFT OUTER JOIN adventureworks_bronze.countryregion    cr \r\n             ON sp.CountryRegionCode = cr.CountryRegionCode;\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-54220b1 elementor-widget elementor-widget-code-highlight\" data-id=\"54220b1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>\r\n         CREATE MATERIALIZED LAKE VIEW IF NOT EXISTS adventureworks_silver.creditcards\r\n               (\r\n     CONSTRAINT cardnumber_chk      CHECK (CardNumber IS NOT NULL) ON MISMATCH DROP,\r\n     CONSTRAINT expirationmonth_chk CHECK (ExpMonth IS NOT NULL)   ON MISMATCH DROP,\r\n     CONSTRAINT expirationyear_chk  CHECK (ExpYear IS NOT NULL)    ON MISMATCH DROP\r\n               )\r\n             AS\r\n         SELECT crd.CreditCardID,\r\n                crd.CardNumber,\r\n                crd.ExpMonth,\r\n                crd.ExpYear,\r\n                prs.FirstName,\r\n                prs.LastName\r\n           FROM adventureworks_bronze.creditcard        crd \r\nLEFT OUTER JOIN adventureworks_bronze.personcreditcard  pcc\r\n             ON crd.CreditCardID = pcc.CreditCardID\r\nLEFT OUTER JOIN adventureworks_bronze.person            prs \r\n             ON pcc.BusinessEntityID = prs.BusinessEntityID;   \r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6077265 elementor-widget elementor-widget-text-editor\" data-id=\"6077265\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><span style=\"font-style: inherit; font-weight: inherit;\">In de\u00a0<\/span><span style=\"font-weight: bold; font-style: inherit;\">Gold<\/span><span style=\"font-style: inherit; font-weight: inherit;\">\u00a0-laag wordt een geaggregeerde tabel opgezet. De tabel wordt eveneens aangemaakt als Materialized Lake View:<\/span><\/p><ul style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><li style=\"font-size: 16px;\"><span style=\"font-weight: bold;\">orderheaders\u00a0<\/span>combineert de brondata van de Sales Header met zowel Shipping- als Billing-adressen en creditcarddata (allemaal opgeslagen in MLV's in de Silver-laag).<\/li><\/ul><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Er worden constraints gedefinieerd om er zeker van te zijn dat zowel het Shipping- als het Billing-adres bestaan; is dat niet het geval, dan mogen de Sales Header-records niet in de MLV worden opgenomen, maar kan de uitvoering van de pijplijn doorgaan<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Aanmaakscripts voor de MLV in de Gold-laag in Fabric:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d6b6c3e elementor-widget elementor-widget-code-highlight\" data-id=\"d6b6c3e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>CREATE MATERIALIZED LAKE VIEW IF NOT EXISTS adventureworks_gold.orderheaders\r\n               (\r\n     CONSTRAINT shiptoaddress_chk CHECK (Bill_To_AddressId IS NOT NULL) ON MISMATCH DROP,\r\n     CONSTRAINT billtoaddress_chk CHECK (Ship_To_AddressId IS NOT NULL) ON MISMATCH DROP\r\n               )\r\n             AS\r\n         SELECT soh.SalesOrderNumber,\r\n                soh.OrderDate,\r\n                soh.ShipDate,\r\n                soh.DueDate,\r\n                soh.Status,\r\n                soh.SubTotal,\r\n                soh.TaxAmt,\r\n                soh.Freight,\r\n                soh.TotalDue,\r\n                bta.AddressID Bill_To_AddressId,\r\n                bta.AddressLine1 Bill_To_AddressLine1,\r\n                bta.AddressLine2 Bill_To_AddressLine2,\r\n                bta.City Bill_To_City,\r\n                bta.PostalCode Bill_To_PostalCode,\r\n                bta.StateProvince Bill_To_StateProvince,\r\n                bta.CountryRegion Bill_To_CountryRegion,\r\n                sta.AddressID Ship_To_AddressId,\r\n                sta.AddressLine1 Ship_To_AddressLine1,\r\n                sta.AddressLine2 Ship_To_AddressLine2,\r\n                sta.City Ship_To_City,\r\n                sta.PostalCode Ship_To_PostalCode,\r\n                sta.StateProvince Ship_To_StateProvince,\r\n                sta.CountryRegion Ship_To_CountryRegion,\r\n                crd.CardNumber,\r\n                crd.ExpMonth,\r\n                crd.ExpYear,\r\n                crd.FirstName,\r\n                crd.LastName\r\n           FROM adventureworks_bronze.salesorderheader soh\r\nLEFT OUTER JOIN adventureworks_silver.addresses        bta \r\n             ON soh.BillToAddressID = bta.AddressID\r\nLEFT OUTER JOIN adventureworks_silver.addresses        sta \r\n             ON soh.ShipToAddressID = sta.AddressID   \r\nLEFT OUTER JOIN adventureworks_silver.creditcards      crd \r\n             ON soh.CreditCardID = crd.CreditCardID;   \r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9adbb7c elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"9adbb7c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><em style=\"font-weight: inherit;\">Opmerking: de attributen die door constraints worden gebruikt, moeten in de SELECT-statement worden gedefinieerd. In het bovenstaande voorbeeld worden zowel Bill To AddressId als Ship To AddressId alleen toegevoegd voor gebruik door de constraint; ze hebben geen business value. Verwijzen naar bta.AddressID of sta.AddressID in de constraints leidt echter tot een fout).<\/em><\/p><p>Zodra de MLV's zijn aangemaakt, wordt automatisch een Data Lineage View gegenereerd. Om deze view te openen, navigeer je naar het Lakehouse en selecteer je Managed Materialized Lake View:<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11780 aligncenter\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/mmlv.png\" alt=\"\" width=\"605\" height=\"386\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/mmlv.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/mmlv-300x191.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p>MLV's zelf worden ook opgeslagen als Delta Tables en zijn als zodanig terug te vinden in de Tables-sectie van het Lakehouse.<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11781 aligncenter\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/autogenlineage.png\" alt=\"\" width=\"605\" height=\"552\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/autogenlineage.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/autogenlineage-300x274.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p>Deze automatisch gegenereerde lineage kan als een pijplijn worden ingepland.<\/p><p>Let echter op:<\/p><ul><li>Alleen MLV's worden vernieuwd. Het vernieuwen van data in de Delta Tables in de Bronze-laag moet in het bovenstaande voorbeeld op een andere manier gebeuren en kan niet in de automatisch gegenereerde pijplijn worden ge\u00efntegreerd. Hetzelfde geldt als bijvoorbeeld andere datatabellen in een van de lagen moeten worden gemanipuleerd.<\/li><li>Alle MLV's, zelfs als ze niet tot dezelfde data lineage behoren, maken deel uit van dezelfde Data Lineage View\/pijplijn. Het bovenste deel van de hieronder getoonde data lineage is dat van de use case uit deze blog, het onderste deel is een andere use case. Beide delen geen enkel object met elkaar.<\/li><\/ul><p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11782 aligncenter\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/lineg2.png\" alt=\"\" width=\"533\" height=\"321\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/lineg2.png 533w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/lineg2-300x181.png 300w\" sizes=\"(max-width: 533px) 100vw, 533px\" \/>Selecteer\u00a0<strong style=\"font-style: inherit;\">Schedule<\/strong><span style=\"font-style: inherit; font-weight: inherit;\"> in het navigatielint om de scheduling van de MLV-pijplijn aan te maken en\/of te onderhouden:<\/span><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11783 aligncenter\" style=\"font-style: inherit; font-weight: inherit;\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/schedule.png\" alt=\"\" width=\"605\" height=\"320\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/schedule.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/schedule-300x159.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/>Het dropdownmenu linksboven toont de huidige en historische runs en moet worden gebruikt om de uitvoeringen van de pijplijn te monitoren\/troubleshooten.<br \/><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-11784\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/viewlineage.png\" alt=\"\" width=\"484\" height=\"203\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/viewlineage.png 484w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/viewlineage-300x126.png 300w\" sizes=\"(max-width: 484px) 100vw, 484px\" \/><br \/>Klikken op een activiteit in het lineage-gedeelte van het scherm of op de activiteitenlijst onderaan het scherm toont meer details over uitvoering\/fouten\/enz.<br \/><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-11785 aligncenter\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/errors.png\" alt=\"\" width=\"605\" height=\"311\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/errors.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/errors-300x154.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p>Opmerkingen:<\/p><ul><li>Alle MLV's zitten in dezelfde pijplijn (zie eerdere opmerking). Alle MLV's zonder inputafhankelijkheid van een andere MLV worden gelijktijdig gestart, en vanaf dat punt bepalen de afhankelijkheden het te volgen pad.<\/li><li>Er is geen spoor van gedropte records door datakwaliteitsconstraints terug te vinden op de activiteiten; ze worden beschouwd als voltooid, zonder enige waarschuwing of indicatie.<\/li><\/ul><p><strong>\u00a0<\/strong><\/p><p><strong>Scenario's<\/strong><\/p><p>Voor de use case worden een aantal scenario's opgezet om de verschillende functionaliteiten van de MLV's te demonstreren.<\/p><p>De data die door Microsoft voor het AdventureWorks 2008 OLTP-schema worden aangeleverd, bevatten geen enkele afwijking van de gespecificeerde datakwaliteitsregels:<\/p><ul><li>Alle OrderHeader-records hebben een Bill To AddressId en een Ship To AddressId.<\/li><li>Alle adressen kunnen worden gekoppeld aan een StateProvince Name en een CountryRegion Name.<\/li><li>Alle kredietkaarten kunnen worden gekoppeld aan een persoon.<\/li><\/ul><p>Initi\u00eble datakwaliteitscontroles:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fa2d0e4 elementor-widget elementor-widget-code-highlight\" data-id=\"fa2d0e4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>SELECT COUNT(*)\r\n           FROM adventureworks_bronze.salesorderheader soh;\r\n             -- 31.465 Records\r\n\r\n             -- All OrderHeader records have a Bill_To_AddressId and a Ship_To_AddressId\r\n         SELECT COUNT(*)\r\n           FROM adventureworks_bronze.salesorderheader soh\r\n           JOIN adventureworks_bronze.address          bta \r\n             ON soh.BillToAddressID = bta.AddressID\r\n           JOIN adventureworks_bronze.address          sta \r\n             ON soh.ShipToAddressID = sta.AddressID;  \r\n             -- 31.465 Records\r\n\r\n         SELECT COUNT(*)\r\n           FROM adventureworks_bronze.address;\r\n             -- 19.164 Records\r\n\r\n             -- All Addresses can be linked to a StateProvince Name and a CountryRegion Name\r\n         SELECT COUNT(*)\r\n           FROM adventureworks_bronze.address          ad \r\n           JOIN adventureworks_bronze.stateprovince    sp \r\n             ON ad.StateProvinceID = sp.StateProvinceID\r\n           JOIN adventureworks_bronze.countryregion    cr \r\n             ON sp.CountryRegionCode = cr.CountryRegionCode\r\n          WHERE sp.Name IS NOT NULL\r\n            AND cr.Name IS NOT NULL;\r\n             -- 19.164 Records\r\n\r\n         SELECT COUNT(*)\r\n           FROM adventureworks_bronze.creditcard        cc\r\n             -- 19.118 Records\r\n\r\n             -- All Credit Cards can be linked to a Person\r\n         SELECT COUNT(*)\r\n           FROM adventureworks_bronze.creditcard        cc\r\n           JOIN adventureworks_bronze.personcreditcard  pcc\r\n             ON cc.CreditCardID = pcc.CreditCardID\r\n           JOIN adventureworks_bronze.person            prs \r\n             ON pcc.BusinessEntityID = prs.BusinessEntityID\r\n          WHERE prs.FirstName IS NOT NULL\r\n            AND prs.LastName IS NOT NULL;\r\n             -- 19.118 Records\r\n   \r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c94714c elementor-widget elementor-widget-text-editor\" data-id=\"c94714c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><span style=\"font-weight: bold; font-style: inherit;\">Scenario 1<\/span><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Dit is de Initial Load, zonder afwijkingen in de datakwaliteit (zie boven).<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">De MLV-schedule draait succesvol:<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-11790\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/mlvschedule.png\" alt=\"\" width=\"18002\" height=\"22822\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/mlvschedule.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/mlvschedule-237x300.png 237w\" sizes=\"(max-width: 18002px) 100vw, 18002px\" \/><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">De sys_dq_metrics-tabel kan worden gebruikt om het aantal geladen records te monitoren. Ze verwijst naar datakwaliteitsmetrics op systeemniveau, die worden gebruikt om de kwaliteit van data in een database of datapijplijn te meten en te monitoren. Deze metrics helpen ervoor te zorgen dat data accuraat, volledig, consistent en betrouwbaar is voor de besluitvorming.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-da46b1c elementor-widget elementor-widget-code-highlight\" data-id=\"da46b1c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>SELECT top(100) \r\n                Namespace,\r\n                MLVName,\r\n                RefreshPolicy,\r\n                RefreshTimestamp,\r\n                Message,\r\n                TotalRowsProcessed,\r\n                TotalRowsDropped,\r\n                TotalViolations,\r\n                ViolationsPerConstraint\r\n           FROM dbo.sys_dq_metrics\r\n          WHERE MLVName in ('orderheaders','addresses','creditcards')\r\n       ORDER BY RefreshTimestamp DESC; \r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-25a64fb elementor-widget elementor-widget-text-editor\" data-id=\"25a64fb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">In deze tabel verwijzen de volgende records naar Scenario 1:<br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11795\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScen1.jpg\" alt=\"\" width=\"944\" height=\"438\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScen1.jpg 944w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScen1-300x139.jpg 300w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScen1-768x356.jpg 768w\" sizes=\"(max-width: 944px) 100vw, 944px\" \/><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">De Total Rows Processed voor elke MLV komt overeen met het aantal records in hun driving tables (salesorderheader, address en creditcard in de Bronze-laag).<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Er werden geen rijen gedropt, er werden geen overtredingen gevonden.<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><span style=\"font-weight: bold;\">Scenario 2<\/span><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Zonder iets aan de inhoud van de Bronze-laag te wijzigen, wordt de MLV-schedule opnieuw gestart<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">De MLV-schedule draait succesvol:<br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11796\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2.png\" alt=\"\" width=\"605\" height=\"770\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2-236x300.png 236w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">In de sys_dq_metrics-tabel verwijzen de volgende records naar Scenario 2:<br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-11797\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2table-1024x545.jpg\" alt=\"\" width=\"1024\" height=\"545\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2table-1024x545.jpg 1024w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2table-300x160.jpg 300w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2table-768x409.jpg 768w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/scen2table.jpg 1057w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">De Total Rows Processed voor elke MLV is 0. Er werden geen rijen gedropt, er werden geen overtredingen gevonden.<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Het systeem detecteert dat er geen wijzigingen zijn aangebracht aan de brondata die door de MLV's wordt gebruikt. De RefreshPolicy is<em>NoRefresh<\/em>, en het bericht is<em>Geen data-update in de brontabel waarvan de MLV afhangt, en dus werd er geen refresh uitgevoerd<\/em>\u2019.<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">Dit bewijst dat alleen de delen van de lineage die zijn gewijzigd, worden vernieuwd. Merk echter op dat er momenteel geen incrementele loads worden ondersteund; ofwel gebeurt er een full refresh van de MLV, ofwel geen refresh.<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><span style=\"font-weight: bold;\">Scenario 3<\/span><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">We forceren een datakwaliteitsprobleem door een CountryRegionCode in de countryregion-tabel in de Bronze-laag bij te werken. Dit resulteert in een lege CountryRegion in de addresses-MLV in de Silver-laag, wat de constraint countryregion_chk in die MLV overtreedt.<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">De volgende Data Manipulation Language (DML) SQL-statement wordt uitgevoerd om het datakwaliteitsprobleem te forceren:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-12f2f38 elementor-widget elementor-widget-code-highlight\" data-id=\"12f2f38\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>UPDATE adventureworks_bronze.countryregion\r\n            SET CountryRegionCode = 'FR_'\r\n          WHERE CountryRegionCode = 'FR'; \r\n\r\n             -- Number of affected rows = 1\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0ccf365 elementor-widget elementor-widget-text-editor\" data-id=\"0ccf365\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<ul><li style=\"font-size: 16px; font-style: normal; font-weight: 400;\">De MLV-schedule draait niet succesvol:<\/li><\/ul><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11799\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/schedulerun3.png\" alt=\"\" width=\"605\" height=\"758\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/schedulerun3.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/schedulerun3-239x300.png 239w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><ul style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><li style=\"font-size: 16px;\">De creditcards-MLV draait succesvol;<\/li><li style=\"font-size: 16px;\">De addresses-MLV faalt door de overtreding van de constraint countryregion_chk in die MLV, terwijl de ON MISMATCH-parameter voor deze constraint op FAIL staat. De error log toont:<br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11800\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/errorlog.png\" alt=\"\" width=\"296\" height=\"90\" \/><\/li><li style=\"font-size: 16px;\">De pijplijn stopt door de datakwaliteitsovertreding; de orderheaders-MLV draait niet<\/li><\/ul><p><br \/>De sys_dq_metrics-tabel bevat geen records voor MLV's die faalden of niet draaiden, dus de enige entry voor Scenario 3 is:<\/p><p style=\"font-size: 16px;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-11801\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScan4-1024x229.jpg\" alt=\"\" width=\"1024\" height=\"229\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScan4-1024x229.jpg 1024w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScan4-300x67.jpg 300w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScan4-768x171.jpg 768w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/TableScan4.jpg 1062w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p><p style=\"font-size: 16px;\">Opmerking:<br \/>Falende constraints lijken tijdrovend te zijn. Tijdens mijn tests duurde de falende MLV addresses meer dan 5 minuten:<\/p><p style=\"font-size: 16px;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11802\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/runtime.png\" alt=\"\" width=\"605\" height=\"45\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/runtime.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/runtime-300x22.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p style=\"font-size: 16px;\">terwijl de initi\u00eble load (Scenario 1, 19.614 adressen laden) slechts 43 seconden duurde. Eerdere tests met dezelfde MLV toonden vergelijkbare resultaten (&gt; 5 minuten bij constraintovertredingen):<\/p><p style=\"font-size: 16px;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11803\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/runtim2.png\" alt=\"\" width=\"605\" height=\"41\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/runtim2.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/runtim2-300x20.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p style=\"font-size: 16px;\"><span style=\"font-weight: bold;\">\u00a0<\/span><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\"><span style=\"font-weight: bold;\">Scenario 4<\/span><\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">We lossen het CountryRegionCode-datakwaliteitsprobleem opnieuw op en forceren een ander datakwaliteitsprobleem door de Expiration Month in de creditcard-tabel in de Bronze-laag bij te werken (alle Expiration Months = 1 worden gewijzigd naar null). Dit resulteert in een lege ExpMonth in de creditcards-MLV in de Silver-laag, wat de constraint expirationmonth_chk in die MLV overtreedt.<\/p><p style=\"font-size: 16px; font-style: normal; font-weight: 400;\">De volgende Data Manipulation Language (DML) SQL-statements worden uitgevoerd om het datakwaliteitsprobleem te forceren:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f11f8ab elementor-widget elementor-widget-code-highlight\" data-id=\"f11f8ab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard\">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>UPDATE adventureworks_bronze.countryregion\r\n            SET CountryRegionCode = 'FR'\r\n          WHERE CountryRegionCode = 'FR_'; \r\n\r\n             -- Number of affected rows = 1\r\n\r\n         UPDATE adventureworks_bronze.creditcard\r\n            SET ExpMonth = null\r\n          WHERE ExpMonth = 1; ; \r\n\r\n             -- Number of affected rows = 1.613\r\n<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7aebd2e elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"7aebd2e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>De MLV-schedule draait succesvol:<\/p><p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11805\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/run4.png\" alt=\"\" width=\"605\" height=\"767\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/run4.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/run4-237x300.png 237w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p>De creditcards-MLV faalt niet door de overtreding van de constraint expirationmonth_chk in die MLV, terwijl de ON MISMATCH-parameter voor deze constraint op DROP staat. De enige plek waar je de gedropte records kunt zien, is de sys_dq_metrics-tabel. Ze bevat het aantal overtredingen \/ gedropte records en het aantal records per falende constraint voor Scenario 4:<br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-11809\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/table4-1024x328.jpg\" alt=\"\" width=\"1024\" height=\"328\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/table4-1024x328.jpg 1024w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/table4-300x96.jpg 300w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/table4-768x246.jpg 768w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/table4.jpg 1056w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p><ul><li>Het aantal records in de MLV creditcards in de Silver-laag = 17.505 (namelijk 19.118 records in de brontabel creditcard van de Bronze-laag min 1.613 falende kredietkaarten (door een ontbrekende Expiration Month)).<\/li><li>De orderheaders-MLV mist geen enkele record; de SQL-code voor deze MLV bevat een Left Outer Join naar de creditcard-MLV, en er werden geen datakwaliteitsconstraints gedefinieerd in de orderheaders-MLV met betrekking tot kredietkaarten;<\/li><li>In tegenstelling tot de constraints met een ON MISMATCH-parameter FAIL, nemen de MLV's met een ON MISMATCH-parameter DROP blijkbaar weinig tot geen extra tijd in beslag<\/li><\/ul><p><strong><br \/>MLV Data Quality Reports<\/strong><\/p><p>Op het lint van de materialized lake views-pagina is een <strong>Data quality report<\/strong>\u00a0-knop te vinden.<br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11813\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualrep.jpg\" alt=\"\" width=\"840\" height=\"282\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualrep.jpg 840w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualrep-300x101.jpg 300w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualrep-768x258.jpg 768w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/><\/p><p>Door op deze knop te drukken, wordt een automatisch gegenereerd data quality report geopend, met zowel een overzichtspagina als een detailpagina:<br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-11814 size-full\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualityreport.png\" alt=\"\" width=\"605\" height=\"338\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualityreport.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualityreport-300x168.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><br \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11815\" src=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualityrep2.png\" alt=\"\" width=\"605\" height=\"337\" srcset=\"https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualityrep2.png 605w, https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/qualityrep2-300x167.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p><p>Terwijl de overzichtspagina alle data van alle MLV's samenvat, laat de detailpagina je focussen op \u00e9\u00e9n of meer MLV's.<\/p><p>Opmerking:<br \/><span style=\"font-style: inherit; font-weight: inherit;\">Deze rapporten houden GEEN rekening met de falende MLV-uitvoeringen door de ON MISMATCH-parameter op een MLV-constraint die op FAIL staat; ze focussen alleen op ON MISMATCH-parameters die op DROP staan. Dit betekent dat noch de Data Quality Reports, noch de sys_dq_metrics-tabel de impact van blokkerende datakwaliteitsproblemen zullen tonen!!!<\/span><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-19f69aa elementor-widget elementor-widget-spacer\" data-id=\"19f69aa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aa35714 elementor-widget elementor-widget-heading\" data-id=\"aa35714\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">OVER DE AUTEUR<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8d15bb1 elementor-widget elementor-widget-author-box\" data-id=\"8d15bb1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"author-box.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-author-box\">\n\t\t\t\n\t\t\t<div class=\"elementor-author-box__text\">\n\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/www.linkedin.com\/in\/luc-busschots-abba344\/\" target=\"_blank\" rel=\"noopener\">\n\t\t\t\t\t\t<h4 class=\"elementor-author-box__name\">\n\t\t\t\t\t\t\tLuc Busschots\t\t\t\t\t\t<\/h4>\n\t\t\t\t\t<\/a>\n\t\t\t\t\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-author-box__bio\">\n\t\t\t\t\t\t<p>Senior BI Consultant<\/p>\n\t\t\t\t\t<\/div>\n\t\t\t\t\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Data engineers spend too much time fixing pipelines.<br \/>\nWith MLVs in Microsoft Fabric, orchestration, lineage &#038; data quality come built-in.<\/p>","protected":false},"author":16,"featured_media":11828,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","footnotes":""},"categories":[5],"tags":[70],"class_list":["post-11759","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-articles","tag-fabric"],"acf":[],"uagb_featured_image_src":{"full":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines.png",2240,1260,false],"thumbnail":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines-150x150.png",150,150,true],"medium":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines-300x169.png",300,169,true],"medium_large":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines-768x432.png",768,432,true],"large":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines-1024x576.png",1024,576,true],"1536x1536":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines-1536x864.png",1536,864,true],"2048x2048":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines-2048x1152.png",2048,1152,true],"trp-custom-language-flag":["https:\/\/sparkle.consulting\/wp-content\/uploads\/2025\/08\/DataPipelines.png",18,10,false]},"uagb_author_info":{"display_name":"Anneli Tomingas","author_link":"https:\/\/sparkle.consulting\/nl\/author\/anneli\/"},"uagb_comment_info":0,"uagb_excerpt":"Data engineers spend too much time fixing pipelines. With MLVs in Microsoft Fabric, orchestration, lineage & data quality come built-in.","_links":{"self":[{"href":"https:\/\/sparkle.consulting\/nl\/wp-json\/wp\/v2\/posts\/11759","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sparkle.consulting\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sparkle.consulting\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sparkle.consulting\/nl\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/sparkle.consulting\/nl\/wp-json\/wp\/v2\/comments?post=11759"}],"version-history":[{"count":74,"href":"https:\/\/sparkle.consulting\/nl\/wp-json\/wp\/v2\/posts\/11759\/revisions"}],"predecessor-version":[{"id":13670,"href":"https:\/\/sparkle.consulting\/nl\/wp-json\/wp\/v2\/posts\/11759\/revisions\/13670"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sparkle.consulting\/nl\/wp-json\/wp\/v2\/media\/11828"}],"wp:attachment":[{"href":"https:\/\/sparkle.consulting\/nl\/wp-json\/wp\/v2\/media?parent=11759"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sparkle.consulting\/nl\/wp-json\/wp\/v2\/categories?post=11759"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sparkle.consulting\/nl\/wp-json\/wp\/v2\/tags?post=11759"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}