Plattformsguide
PDQ följer en skiktad dataplattformsarkitektur där data flödar genom fyra distinkta steg — från rå källextraktion till kvalitetsövervakade lagermodeller. Varje lager har ett tydligt ansvar och väldefinierad överlämning till nästa.
DATAKÄLLOR ──► INGEST ──► DLS ──► DWA
│
▼
QPI
| Lager | Fullständigt namn | Ansvar |
|---|---|---|
| INGEST | Ingestion | Extrahera data från källsystem (databaser, API:er, filer) och landa den i datasjön |
| DLS | Data Lake Service | Organisera, arkivera, validera och publicera rådata genom lagringszoner |
| DWA | Data Warehouse Automation | Modellera, mappa och transformera data till strukturerade lagermodeller |
| QPI | Quality Performance Indicator | Övervaka datahälsa, mappningstäckning och pipelinekvalitet |
Hur lagren kopplas samman
Källsystem → INGEST
Källsystem registreras med en anslutningstyp (Database, API, File, Custom eller Manual). Varje system kan ha en eller flera källexporter som definierar hur data extraheras — vad som ska frågas, vilka kolumner som ska inkluderas, hur ofta det ska köras och vilket utdataformat som ska produceras.
INGEST → DLS
Exporterad data landar i Landing Zone. Därifrån arkiverar DLS-pipelinen den till Raw Zone, bearbetar den genom DLS Workers, validerar den till Trusted Zone och profilerar den i Profile Zone.
DLS → DWA
Betrodd data synkroniseras/publiceras till Published Zone, där den blir tillgänglig för lagermodellering. DWA-lagret mappar källfält till modellattribut genom en trestegsstragi: Stage → Base → Core.
DWA ← QPI
Kvalitetsindikatorer beräknas över alla lager. Mappningstäckningsprocent, fältnivåstyrningsflaggor och dataprofilresultat ger kontinuerlig återkoppling om pipelinens hälsa.
Zonarkitektur
Data passerar genom en serie lagringszoner, var och en med ett specifikt syfte:
┌──────────┐ ┌──────────────┐ ┌─────────────┐ ┌───────────────┐
│ Landing │ ──►│ Raw Archive │ ──►│ Trusted │ ──►│ Published │
│ Zone │ │ Zone │ │ Zone │ │ Zone │
└──────────┘ └──────────────┘ └─────────────┘ └───────────────┘
Temporär Oföränderlig Validerad Fråge-redo
staging revisionsspår & rensad tabeller
Zonnamn är konfigurerbara i Settings och följer en sökvägskonvention:
{ZoneName}/{System}/{Filename}/{YYYY}/{MM}/{DD}/
Modelltiers (DWA)
Lagret använder en trestegs modelleringsstrategi:
| Tier | Syfte | Exempel |
|---|---|---|
| Stage Model | Normalisera rådataformat från olika källor | Standardisera datumformat, kolumnnamn |
| Base Model (Ensemble) | Integrera data från flera källor med konsekventa regler | Sammanfoga CRM + ERP kundposter |
| Core Model (Integrated) | Slutgiltiga deduplicerade affärsentiteter för konsumtion | Rena Customer, Order, Product-tabeller |
Nyckelterminologi
| Koncept | Beskrivning |
|---|---|
| Source Export | Ett konfigurerat extraktionsjobb från ett källsystem (DB-fråga, API-anrop, filhämtning) |
| Connection | Den tekniska länken till ett källsystem (autentisering, URL:er, sökvägar) |
| Sourcefile | Definitionen av en ingested fils struktur — fält, typer, nycklar och styrningsflaggor |
| Mapping | En länk mellan ett sourcefilefält och ett modellattribut, eventuellt med transformationer |
| Model | En måltabell i lagret med typade attribut, affärsnycklar och relationer |
| Business Key | Ett eller flera attribut som unikt identifierar en post i en modell |
| CDC | Change Data Capture — spåra enbart nya, ändrade eller borttagna poster mellan körningar |
| Data Profiling | Automatiserade kvalitetskontroller och validering mot datakontraktet |
Fördjupning per lager
- INGEST
- DLS
- DWA
- QPI
Ingest-lagret ansvarar för att hämta data från källsystem och landa den i datasjön. Det hanterar vad, när och hur för dataextraktion.
Anslutningstyper
Innan du kan skapa exporter måste en anslutning konfigureras för ditt källsystem. Anslutningstypen avgör vilka fält anslutningen bär; inom en typ kör körningen exakt en operatorklass per källsystem, och operatorn avgör vilka av fälten som faktiskt läses.
| Anslutningstyp | Källa | Operatorer |
|---|---|---|
| Database (DB) | SQL-databaser som nås med SQL | PostgreSQL, SQL Server, Oracle, MySQL |
| API | HTTP-ändpunkter som returnerar JSON | Generisk REST, Heartpace, Salesforce Service Cloud, Talkdesk, SharePoint (Graph), Microsoft Teams, Google Drive / Sheets |
| File | Fillagringssystem | Lokal disk, Amazon S3, Azure Data Lake Gen2, SFTP |
| Custom | Meddelandeköer och skräddarsydda källor | AWS SQS, Azure Service Bus, Redis, samt kundspecifika kopplingar |
| Manual | Ingen automatiserad extraktion | Data uppladdad manuellt |
Köoperatorerna levereras under Custom-kontraktet, så en kös koordinater färdas som key=value-anslutningsegenskaper i stället för som egna fält. Inget i köbeteendet ändras av det.
Tre anslutningsinställningar formar varje export som görs från anslutningen:
| Inställning | Effekt |
|---|---|
AddServiceColVal | När den är satt får varje exporterad post en __service-kolumn med detta värde. Tomt värde stänger av kolumnen. |
ColumnDelimiter | Fältavgränsare när CDC skriver CSV-utdata. Ignoreras för JSON. |
LineDelimiter | Postavgränsare som skickas till CDC. Alla operatorer utom den generiska databasoperatorn tvingar radbrytning oavsett detta värde. |
Den fullständiga fältreferensen för anslutningar — autentiseringsuppgifter, autentiseringsmetoder, lagringsinställningar och kökoordinater — finns i utvecklarguiden för Ingest.
Exporttyper
Varje källsystem kan ha en eller flera källexporter. Exporttypen matchar anslutningstypen, och fält som operatorn ignorerar visas men märks som oanvända.
Databasexporter
Extrahera data med SQL-frågor från anslutna databaser. Frågan strömmas i block om 25 000 rader och skrivs som radbrytningsseparerad JSON.
| Inställning | Beskrivning |
|---|---|
databaseName | Referens till den anslutna databasen. Skrivskyddad, hämtas från anslutningen. |
fromClause | Tabell, vy, funktion eller lagrad procedur att fråga. Måste vara schemakvalificerad (dbo.Customers) — metadatauppslaget delar på punkten. |
whereClause | Valfritt SQL-villkor. Infogas ordagrant, så det måste innehålla nyckelordet WHERE. Ett inkrementellt filter läggs till med AND. |
sqlOverride | Fullständig anpassad SQL-fråga — ersätter den genererade frågan helt. Tidstoken substitueras fortfarande, men det inkrementella filtret läggs inte till; bygg in det i frågan själv. |
inclTables | Ytterligare tabeller vars kolumnmetadata hämtas för typkonvertering. Standard är from-satsen. |
inclColumns | Sammanfogas med kommatecken rakt in i SELECT-satsen, så alias och uttryck fungerar. ["*"] väljer allt. |
filterColumn | Aktiverar inkrementell laddning. Jämförelsen är numerisk, så kolumnen måste vara ett stigande tal. |
lastFilterValue | Vattenmärket från föregående körning, som postas tillbaka till plattformen efter varje körning. 0 vid första körningen. |
Två lägen:
- Standardläge — bygg frågan från
fromClause+whereClause+ kolumnval - SQL Override-läge — skriv en komplett anpassad SQL-sats som förbigår den genererade frågan
Databasexporter beräknar också en __checksum per post, vilket aktiverar den snabba CDC-jämförelsen.
API-exporter
Extrahera data från HTTP-ändpunkter. Utdata är alltid radbrytningsseparerad JSON — outputFormat ignoreras här.
| Inställning | Beskrivning |
|---|---|
apiUrl | Bas-URL för API:et. Skrivskyddad, hämtas från anslutningen. |
apiPath | Ändpunktens sökväg, som läggs till bas-URL:en. |
filterCondition | Nyckel=värde-par som skickas som förfrågningsparametrar — en query-sträng, eller en JSON-body när anslutningens method-header är post. |
Filtervillkor är strängarrayer som ["user_status=active", "date_from=2024-01-01"]. Tidstoken substitueras i värdena, och ett värde som innehåller klamrar tolkas som JSON, så en JSON-body kan konfigureras som ett filtervillkor.
Fel: en 401 utlöser en förnyelse av token och ett omförsök. Övriga statuskoder från 400 och uppåt får arbetslasten att misslyckas, liksom ett svar utan detekterbar innehållstyp.
Operatorspecialiseringar hanterar pagineringar och jobbmodeller som den generiska operatorn inte klarar:
| Operator | Pagineringsmodell |
|---|---|
| Heartpace | limit/offset, styrt av svarets meta-block |
| Salesforce Service Cloud | Följer nextRecordsUrl tills resultatmängden rapporterar sig färdig |
| Talkdesk | Asynkrona rapportjobb, som pollas var tionde sekund i upp till 50 minuter |
| SharePoint (Graph) | Rekursiv mappgenomgång, sorterad nyast först med tidigt avbrott |
| Teams, Google Drive | En enda förfrågan som returnerar en values-array vars första rad är rubriken |
Filexporter
Extrahera data från fillagringssystem. Matchande filer kopieras lokalt och konverteras sedan med DuckDB eller skickas vidare orörda.
| Inställning | Beskrivning |
|---|---|
filePath | Källkatalogens prefix, som läggs till anslutningens bassökväg. Tidstoken substitueras här, så en partitionerad källa kan adresseras med [__SCHEDULEDTIME_AS_HIVE__]. |
fileName | En delsträngsmatchning mot filnamnet — inte ett glob-mönster. |
filterCondition | Filurval och läsaralternativ (nedan). |
outputFormat | json eller csv konverterar filerna; binary laddar upp dem orörda och hoppar över CDC. Konverterad utdata skrivs gzippad. |
Nycklar för filurval:
| Nyckel | Standard | Beskrivning |
|---|---|---|
delete | False | Tar bort källfilerna efter lyckad kopiering. Det går inte att ångra. |
use_filename_timestamps | False | True matchar tidsstämpeln i filnamnet; False filtrerar på senast ändrad-tid. |
file_timestamp_format | [YYYY][MM][DD] | Tidsstämpelmönstret inuti filnamnen. Den finaste delen som finns med sätter också sökgranulariteten. |
start_timestamp | nu | ISO-datumtid — tidsfönstrets början. |
end_timestamp | nu | ISO-datumtid — tidsfönstrets slut. |
find_partitions | False | Endast Amazon S3. Listar underprefix under bassökvägen och söker i varje. Inte partitionsmedveten — för en year=/month=/day=-struktur, använd ett Hive-token i filePath i stället. |
Nycklar för läsaren:
| Nyckel | Standard | Beskrivning |
|---|---|---|
excel_sheet, excel_range | – | Bladnamn och cellområde för .xlsx-filer. |
csv_has_header | true | Första raden är rubrikrad. |
csv_sample_size | 10000 | Rader som samplas för typdetektering. |
json_sample_size | 10000 | Rader som samplas för schemahärledning. |
json_format | auto | auto, newline_delimited, array och DuckDB:s övriga JSON-format. |
json_union_by_name | true | Slår ihop scheman över filer i stället för att kräva identiska. |
file_encoding | utf-8 | Teckenkodning för CSV. |
Formatet detekteras i ordningen .xlsx → .parquet → JSON → CSV; filer som inte matchar något av dem faller tillbaka på binär kopiering. Alla matchande filer läses i en och samma omgång, så de måste dela schema om inte json_union_by_name täcker skillnaden.
Köexporter
Omvandlar en meddelandeström till batchfiler. En körning tömmer kön och avslutas sedan, så exporten ligger kvar på det vanliga schemat i stället för att köra en egen loop.
Själva kön konfigureras på anslutningen; exporten lägger bara till batchgränserna, via filterCondition:
| Nyckel | Standard | Beskrivning |
|---|---|---|
max_batch_bytes | 31457280 (30 MB) | Stäng batchfilen vid denna okomprimerade storlek. |
max_batch_seconds | 900 (15 min) | Stäng batchfilen efter denna tid i klocktimmar. |
max_batches_per_run | 0 (obegränsat) | Begränsar en het kö så att den inte svälter ut andra arbetslaster. |
Beteende värt att känna till:
- En tom kö skriver ingenting. Ingen nollbytefil skapas och ingen nedströmsbearbetning körs.
- CDC förbigås. Händelser konsumeras en gång och uppdateras aldrig, så sätt
enableCDC: 0för att slippa en meningslös baslinjefil. - Leverans är minst-en-gång. Kvittering sker efter att batchen skrivits till disk, så en krasch mitt i en körning leder till omleverans snarare än förlust.
- Felformade meddelanden skickas vidare, med en
__parseError-markering, i stället för att bli liggande som gift i kön. - Batchfiler namnges
<alias>_<suffix>_batch<NNNNNN>.txt.
Familjen är gjord för högvolymströmmar av små händelser. Landa stora payloads i objektlagring och läs in dem som en filexport, och låt kön bära bara pekaren.
Anpassade exporter
Minimal konfiguration för proprietära integrationer. Anslutningens egenskaper är den enda konfigurationskanalen, filterCondition substitueras och skickas till kopplingen, och outputFormat blir utdatafilens filändelse.
Schemaläggning
Alla exporttyper stöder schemaläggning:
| Inställning | Beskrivning | Exempel |
|---|---|---|
scheduleCycle | Frekvens | never, hourly, daily, monthly |
scheduleCycleInterval | Multiplikator | 2 med hourly = varannan timme |
scheduleDoNotStartBeforeTime | Tidigaste tillåtna start | 02:00:00 (starta inte före 02:00) |
never stänger av en export utan att radera den.
Exportstrategier
Att välja rätt exportstrategi är avgörande för att balansera datafärskhet mot kostnad och volym.
Fullständig export
Extraherar hela datasetet varje gång. Enkelt men dyrt för stora tabeller.
När den ska användas:
- Små referens-/dimensionstabeller
- Källsystem som inte stöder ändringsspårning
- Initiala laddningar eller periodiska fullständiga uppdateringar
Så konfigurerar du:
- Inga särskilda inställningar behövs — detta är standardbeteendet
- Låt
stopAtRow: -1stå kvar för ingen radgräns
Inkrementell export (vattenmärke)
Läser bara de rader källan har lagt till sedan förra körningen. Endast databaskällor.
När den ska användas:
- Stora transaktionstabeller där fullständiga exporter blir för dyra
- Tabeller med en tillförlitligt stigande nyckel eller sekvens
Så konfigurerar du:
- Sätt
filterColumntill en stigande numerisk kolumn — jämförelsen är numerisk, så en text- eller datumkolumn fungerar inte - Låt
lastFilterValuevara; agenten postar tillbaka det nya vattenmärket efter varje körning, med start från0
Så fungerar det:
- Den genererade frågan får ett villkor av typen
filterColumn > lastFilterValue - Kolumnens maxvärde följs per block och returneras som det nya vattenmärket
- En körning som kapats av
stopAtRowflyttar inte fram vattenmärket, så inget hoppas över nästa gång sqlOverrideförbigår detta helt — filtret läggs inte till i en anpassad fråga
Change Data Capture (CDC)
Jämför den här körningens extrakt mot föregående och märker varje post som ändrad, raderad eller oförändrad. Finns för alla källtyper som producerar rader.
När den ska användas:
- Källor utan egen ändringsindikator
- Alla källor där nedströms behöver veta om raderingar
Så konfigurerar du:
- Sätt
enableCDC: 1på exporten (0exporterar allt varje körning) - Markera fälten som ska följas med
includeInCDC: 1i sourcefile-strukturen - Använd ett
validFrom-fält för att identifiera vilken version av en post som är aktuell - Sätt
sortOrderpå versionsfältet (positivt = fallande, senaste först)
Så fungerar det:
- Föregående extrakt behålls som en baslinjefil med namnet
<alias>_latestversion.txtoch jämförs i DuckDB - Poster skrivs med en
__cdc-kolumn med värdetchange,deleteellerequal - Där en
__checksumfinns — databaskällor — ersätts den fullständiga jämförelsen av en indexerad anti-join, vilket är betydligt snabbare på breda tabeller - Om kolumnuppsättningen ändrats mellan körningar returneras hela den nya laddningen, märkt som ny
- Utdata delas vid ungefär 2 GB per fil; varje del laddas upp
Ingen baslinjefil betyder fullständig laddning, så den första körningen efter att CDC slagits på exporterar alltid allt. Varje körning väver dessutom in ett litet urval av den nya datan som en medveten omsådd, så CDC-utdata är aldrig ett rent delta.
stopAtRow stänger av CDC för den körningen och kastar den kapade utdatan i stället för att behålla den som baslinje — ett kapat extrakt jämfört mot en fullständig baslinje skulle läsa varje rad det inte skrev som en radering. Det är ett testreglage, inte en strypventil.
Binära filexporter och köexporter förbigår CDC helt.
Glidande fönster
En tidsbegränsad extraktion som flyttas framåt vid varje körning, eftersom fönstret uttrycks som tidstoken som renderas om varje körning i stället för som fasta datum.
När den ska användas:
- Filinläsning där filnamn eller partitionssökvägar bär tidsstämplar
- API:er med datumintervallparametrar
- Scenarier där du behöver de senaste N dygnen eller timmarna
Så konfigurerar du (filexporter):
- Sätt
use_filename_timestamps: Trueom tidsstämpeln finns i filnamnet, ochfile_timestamp_formatså att det matchar — annars matchas fönstret mot senast ändrad-tid - Uttryck fönstret med token i stället för datum:
filterCondition: ["start_timestamp=[__SCHEDULEDTIME_MINUS_1_DAYS__]", "end_timestamp=[__SCHEDULEDTIME__]"]
- För en partitionerad källa, adressera partitionen från
filePathmed[__SCHEDULEDTIME_AS_HIVE__]
Så konfigurerar du (API-exporter): Använd samma token i förfrågningsparametrarna:
filterCondition: ["date_from=[__LASTEXECUTION__]", "date_to=[__SCHEDULEDTIME__]"]
En körning läser ett fönster. [__SCHEDULEDTIME__] är den tidslucka körningen tillhör snarare än klocktiden, så ett omförsök läser samma fönster — men ett missat dygn innebär att den schemaläggningen körs om, inte att fönstret vidgas.
Kolumnval
Styr vilka kolumner som hamnar i den exporterade datan.
Inkluderings- och exkluderingslägen
Inkluderingsläge (standard):
Som standard gäller inclColumns: ["*"] — alla kolumner inkluderas. För att bara ta med vissa kolumner:
inclColumns: ["CustomerID", "Name", "Email", "CreatedDate"]
exclColumns: []
Exkluderingsläge: Ta med allt utom vissa kolumner:
inclColumns: ["*"]
exclColumns: ["InternalNotes", "TempFlag", "DebugData"]
Regler:
- Om
inclColumnsinnehåller"*"inkluderas alla fält exclColumnsfungerar som en svartlista ovanpå inkluderingslistan — nekande vinner- UI:t hindrar dig från att lämna noll inkluderade fält — det faller tillbaka på
["*"] - Kolumnnamn är skiftlägeskänsliga och måste matcha källan exakt
På databasexporter beter sig de två listorna olika. inclColumns fogas in i SELECT-satsen och är därmed det enda sättet att ta bort en kolumn; exclColumns stänger bara av typkonvertering och tar inte bort något ur utdatan.
Datatransformationer
Substitutioner
Substitutioner härleder eller ger standardvärde åt en kolumn medan exporten skrivs. Var och en definieras som { column, alias, replace, type }:
| Egenskap | Beskrivning |
|---|---|
column | Källkolumnen som substitutionen läser |
alias | Valfri målkolumn. Utan den skrivs källkolumnen över |
replace | Uttrycket eller literalen som används som ersättning |
type | transform — replace är ett uttryck som beräknas mot cellvärdet, och tillämpas bara när värdet inte är null. null — replace är standardvärdet som används när värdet är null |
Typiska användningar är att ersätta null-värden och att maska känsliga värden innan de lämnar källan.
replace beräknas som kod av agenten. Behandla exportdefinitioner som betrodd konfiguration, inte som användarindata.
Utdataformat och filnamn
Utdataformat (outputFormat):
| Format | Beskrivning |
|---|---|
json | Radbrytningsseparerad JSON. Standardvärdet, och det enda format de vanliga API-operatorerna skriver |
csv | Avgränsad text, med anslutningens ColumnDelimiter |
binary | Filer laddas upp orörda. Hoppar över konvertering och CDC; endast filkällor |
TABLE, ICEBERG och JSON är målformat som väljs på sourcefile i DLS — de är inte utdataformat för export.
Dynamiska filnamn (suffix):
Suffixet som läggs till utdatafilens namn är antingen en bokstavlig sträng eller ett tidstoken:
| Token | Värde |
|---|---|
[__SCHEDULEDTIME__] | Tidsluckan körningen tillhör — oförändrad av en sen start eller ett omförsök |
[__EXECUTIONTIME__] | Faktisk körningstid, i agentens tidszon |
[__LASTEXECUTION__] | Föregående lyckade körnings schemalagda tid (1900-01-01T00:00:00 vid första körningen) |
Samma token fungerar i förfrågningsparametrar, filsökvägar, where-satser och ändpunkterna i ett filurvalsfönster. De tar ett valfritt tidsavdrag och ett valfritt format:
[__<TIME>[_MINUS_<N>_<UNIT>][_AS_<FORMAT>]__]
<UNIT> är SECONDS, MINUTES, HOURS, DAYS eller WEEKS; det finns inget _PLUS_, eftersom en export läser ett fönster som redan inträffat. <FORMAT> är TIMESTAMP, DATETIME, DATE, DATECOMPACT, TIME, ISO, EPOCH, EPOCHMS eller HIVE, eller ett bokstavligt mönster byggt av [YYYY] [YY] [MM] [DD] [HH] [MI] [SS]. Ett värde utan _AS_-segment ärver exportens dateTimeFormat, som är TIMESTAMP som standard — eller DATETIME för databaskällor, vilket passar SQL-literaler.
HIVE renderar en partitionssökväg som year=2026/month=8/day=13 i stället för en datumtid, för att läsa källor som är upplagda så. Det hör hemma i en filsökväg och kan inte användas som exportövergripande format. Se utvecklarguiden f ör Ingest för varianterna med granularitet och nollutfyllnad.
Radbegränsning:
Sätt stopAtRow för att begränsa en exports storlek: -1 är ingen gräns, och valfritt positivt tal stoppar körningen där. Vad som räknas beror på källan:
| Källa | Enhet |
|---|---|
| Databas, API, anpassad | Rader |
| Fil, konverterad | Skrivna rader — alla matchande filer laddas fortfarande ned |
| Fil, binär | Filer — det enda fallet där enheten inte är rader |
| Kö | Meddelanden, räknade över hela körningen |
Eftersom en kapad körning också stänger av CDC är stopAtRow till för att testa en ny export, inte för att begränsa en i produktion.
Tekniska kolumner
Varje export lägger till egna kolumner vid sidan av källdatan:
| Kolumn | Läggs till när | Värde |
|---|---|---|
__service | AddServiceColVal är satt på anslutningen | Det värdet |
__scheduledAt | Alltid | Körningens schemalagda tid, med exporttiden som reserv |
__exportedAt | Alltid | När exporten började skriva |
__checksum | Databaskällor | Hash av posten, som möjliggör den snabba CDC-vägen |
__cdc | CDC är påslaget | change, delete eller equal |
__parseError | Ett kömeddelande inte kunde tolkas | Tolkningsfelet, med den råa bodyn bevarad |
Destinationssökvägar
Exporterad data landar i konfigurerade zonsökvägar:
| Zon | Källa | Syfte |
|---|---|---|
| Landing Zone | Från Settings (landingZoneName) | Temporär staging |
| Raw Zone | Från Settings (rawZoneName) | Permanent arkiv |
| Trusted Zone | Från Settings (trustedZoneName) | Validerad data |
Standard sökvägsmönster: {system}/{filename}/{YYYY}/{MM}/{DD}/
Sourcefile Structure
När data har ingesterats beskrivs den av en sourcefile — schemadefinitionen för inkommande data.
Nyckelegenskaper
| Egenskap | Beskrivning |
|---|---|
sourceFilename | Unik identifierare |
system | Källsystemreferens |
fileType | CSV, JSON eller XML |
fileEncoding | UTF-8, UTF-16, Windows-1252 |
columnDelimiter | Avgränsare för CSV-filer |
targetMethod | replace, append eller upsert i gränssnittet; API:et accepterar fler — se DLS-fältreferensen |
targetFormat | TABLE, ICEBERG eller JSON |
targetNormalization | single, lists eller lists_objects |
fileCompressionType | Komprimeringstyp (gzip nivå 1–9 eller ingen) |
enableEncryption | Krypteringsflagga |
Hierarkisk filstruktur
För nästlad data (t.ex. JSON med arrayer) stöder sourcefile en hierarkisk struktur:
Level 0 (OBJECT): Root
├── customer.id (keyFieldIndicator=1)
├── customer.name
└── customer.loadDate (validFrom=1)
Level 1 (LIST): orders (useForSplittingRecords=1)
├── order.orderId
├── order.amount
└── order.status
Varje nivå kan vara ett OBJECT (enskild post) eller LIST (array som delas upp i rader).
Fältnivåegenskaper
| Egenskap | Beskrivning |
|---|---|
fieldKey | Källkolumnnamn (skiftlägeskänsligt) |
fieldAlias | Valfritt omdöpt kolumnnamn |
dataType | Varchar, Integer, Decimal, Boolean, Time, Date, Timestamp |
keyFieldIndicator | 1 = del av primärnyckel |
keyOrder | Position i sammansatt nyckel |
fieldOrder | Kolumnordning i mål |
excludeField | 1 = hoppa över detta fält helt |
excludeFromProfiling | 1 = kör inte kvalitetskontroller |
sensitive | 1 = PII/känslig data-flagga |
includeInCDC | 1 = spåra ändringar för detta fält |
validFrom | 1 = SCD Typ 2-versioneringsfält (max ett per nivå) |
fieldDomain | Styrningsklassificeringskategori |
Bästa praxis
Välja exportstrategi
| Scenario | Rekommenderad strategi |
|---|---|
| Liten dimensionstabell (<100K rader) | Fullständig export med CDC, dagligen |
| Stor transaktionstabell med stigande nyckel | Inkrementellt vattenmärke på filterColumn |
| Stor tabell utan ändringsindikator | Fullständig export med CDC — checksummevägen håller jämförelsen billig |
| Fildrop med tidsstämplade filnamn | Glidande fönster på start_timestamp / end_timestamp |
Partitionerad sjö (year=/month=/day=) | Hive-token i filePath, en partition per körning |
| API med paginering + datumfilter | Glidande fönster via förfrågningsparametrar |
| Meddelandekö | Batchgränser på anslutningen, CDC avstängt |
| Initial dataladdning | Fullständig export, byt sedan till inkrementell |
Tips för kolumnval
- Börja med
inclColumns: ["*"]och användexclColumnsför att ta bort oönskade kolumner - På databasexporter tar du i stället bort kolumner ur
inclColumns—exclColumnstar inte bort dem där - Exkludera stora text-/blob-kolumner som inte behövs nedströms
- Exkludera interna/felsökningskolumner som skapar brus
- Kom ihåg: kolumnnamn är skiftlägeskänsliga
Schemaläggningsöverväganden
- Använd
scheduleDoNotStartBeforeTimeför att undvika körning under högtrafiktimmar - För beroende exporter, förskjut scheman (t.ex. dimensionstabeller före faktatabeller)
- Använd
monthly-cykel för långsamt föränderlig referensdata - Använd
hourlymed litet intervall för nästan-realtidsbehov
DLS-lagret hanterar hur data flödar genom lagringszoner — från rå landing till validerade, fråge-redo tabeller. Det hanterar arkivering, bearbetning, validering och publicering.
Zonarkitektur
┌──────────┐ ┌──────────────┐ ┌─────────────┐ ┌───────────────┐
│ Landing │ ──►│ Raw Archive │ ──►│ Trusted │ ──►│ Published │
│ Zone │ │ Zone │ │ Zone │ │ Zone │
└──────────┘ └──────────────┘ └─────────────┘ └───────────────┘
Landing Zone
- Syfte: Temporärt stagingområde där exporterad data först anländer
- Livscykel: Filer bearbetas och flyttas till Raw Archive — behålls inte långsiktigt
- Sökvägsformat:
{landingZoneName}/{system}/{filename}/ - Inga datumtoken — landing är en övergående buffert
Raw Archive Zone
- Syfte: Oföränderlig, permanent post av varje fil som ingesterades
- Livscykel: Skriv en gång, ändra aldrig — fungerar som revisionsspår
- Sökvägsformat:
{rawZoneName}/{system}/{filename}/{YYYY}/{MM}/{DD}/ - Datumpartitionerad för effektiva historiska frågor
Trusted Zone
- Syfte: Validerad, rensad och standardiserad data redo för modellering
- Livscykel: Uppdateras av DLS Workers efter att validering godkänts
- Sökvägsformat:
{trustedZoneName}/{system}/{filename}/{YYYY}/{MM}/{DD}/ - Kvalitetsgrind — data når bara Trusted efter att ha klarat profileringskontroller
Published Zone
- Syfte: SQL-optimerade tabeller redo för direkt frågning och lagerkonsumtion
- Livscykel: Synkroniseras från Trusted via Publish-steget
- Styrs av:
publishedZoneNameochpublishedModelSchemai Settings
Zonkonfiguration
Alla zonnamn är konfigurerbara i Settings → Data Lake Settings:
| Inställning | Beskrivning | Exempel |
|---|---|---|
landingZoneName | Landing zone-etikett | landing |
rawZoneName | Raw archive-etikett | raw |
trustedZoneName | Trusted zone-etikett | trusted |
publishedZoneName | Published zone-etikett | published |
Lagringsinställningar
| Inställning | Beskrivning |
|---|---|
storageIntegration | Snowflake storage integration-namn (krävs för externa steg) |
externalVolume | Extern volym för datastaging |
formatFile | Formatdefinitionsfil (JSON/text) |
tableCatalog | Snowflake-katalogspecifikation |
publishedModelSchema | Målschema för publicerade modeller |
DLS-pipelinen
Landing ──► Raw Archive ──► DLS Workers (×3) ──► Trusted + Profile
│
▼
Sync/Publish
│
▼
Published Zone
DLS Workers — tre parallella arbetarprocesser hanterar datatransformation och validering:
- Parsa inkommande filformat (CSV, JSON, XML)
- Tillämpa datatypstvång och normalisering
- Köra profileringskontroller när
enableProfilerär aktivt - Skriva validerad data till Trusted Zone
- Skriva profilstatistik till Profile Zone
Sync/Publish-steget — överbryggar gapet mellan DLS (Trusted Zone) och DWA (Published Zone):
- Genererar laddnings-SQL för målformatet (TABLE eller ICEBERG)
- Tillämpar den konfigurerade
targetMethod(replace, append eller upsert) - Skapar eller uppdaterar tabeller i Published-schemat
Publiceringsmönster
Målmetoder
targetMethod på en sourcefile styr hur data laddas i publicerade tabeller:
| Metod | Beteende | När den ska användas |
|---|---|---|
| replace | Radera och återskapa måltabellen med ny data | Små tabeller, fullständiga uppdateringar, referensdata |
| append | Lägg till nya rader i befintlig tabell | Händelse-/loggdata, append-only-mönster |
| upsert | Infoga nya rader, uppdatera befintliga rader efter nyckel | Dimensionstabeller med SCD-spårning, masterdata |
Målformat
| Format | Beskrivning | Överväganden |
|---|---|---|
| TABLE | Standard Snowflake-tabell | Bäst för de flesta användningsfall, fullt SQL-stöd |
| ICEBERG | Apache Iceberg-tabellformat | Bättre för multimotor-åtkomst, tidsresor, schemaevolution |
| JSON | Semi-strukturerad lagring | När strukturen är okänd eller mycket variabel |
SQL-generering
PDQ genererar laddnings-SQL automatiskt baserat på din konfiguration:
- Sourcefile-struktur definierar kolumner och typer
- Målmetod bestämmer INSERT/MERGE/CREATE OR REPLACE-beteende
- Mappningar styr vilka fält som mappar till vilka modellattribut
- Settings ger schema-, katalog- och lagringsintegrationsdetaljer
Du kan förhandsgranska den genererade SQL:en innan körning för att verifiera att den matchar din avsikt.
Publiceringsöverväganden
Datanormalisering
targetNormalization-inställningen styr hur nästlad/hierarkisk data plattas ut:
| Läge | Beteende | Exempel |
|---|---|---|
single | En tabell per sourcefile | Platt CSV → enskild måltabell |
lists | Dela arrayer i separata tabeller | JSON med nästlade arrayer → förälder + barntabeller |
lists_objects | Dela arrayer och nästlade objekt | Djupt nästlad JSON → helt normaliserat tabellset |
Sökvägstokenstöd
Zonsökvägar stöder datumtoken för tidsbaserad partitionering:
| Token | Värde |
|---|---|
{YYYY} | Fyrsiffrigt år |
{MM} | Tvåsiffrig månad |
{DD} | Tvåsiffrig dag |
{HH} | Tvåsiffrig timme |
Exempel: trusted/SAP/customers/{YYYY}/{MM}/{DD}/
Landing Zone-sökvägar stöder inte datumtoken — de använder en platt sökväg.
Komprimering och kryptering
| Inställning | Alternativ |
|---|---|
fileCompressionType | Ingen, eller gzip (nivå 1–9) |
fileCompressionLevel | 1 (snabbast) till 9 (minst) |
enableEncryption | Aktivera/inaktivera kryptering vid vila |
Stödda filkodningar: UTF-8 (standard, rekommenderad), UTF-16, Windows-1252
Bästa praxis
Zondesign
- Håll Raw Archive oföränderligt — ändra eller radera aldrig filer i Raw Zone. Det är din återställningsväg.
- Använd datumpartitionering — inkludera alltid
{YYYY}/{MM}/{DD}i Raw- och Trusted-sökvägar för effektiv frågning och livscykelhantering. - Namnge zoner tydligt — använd beskrivande namn som gör det uppenbart var data befinner sig i sin livscykel.
Publiceringsstrategi
| Scenario | Rekommenderat tillvägagångssätt |
|---|---|
| Liten referenstabell (<100K rader) | replace-metod, TABLE-format |
| Stor faktatabell (miljontals rader) | append-metod med CDC uppströms |
| Långsamt förändrande dimension | upsert-metod med affärsnycklar |
| Multimotor-analys (Spark + Snowflake) | ICEBERG-format |
| Okänt/evolverande schema | JSON-format initialt, migrera till TABLE när stabilt |
Prestandaöverväganden
- Profilering ökar beräkningskostnaden — aktivera
enableProfilerför kritisk data, överväg att inaktivera för högvolym, välförstådda källor - Komprimering sparar lagring — använd gzip nivå 6 som en bra balans mellan hastighet och storlek
- Välj upsert noggrant — det kräver väldefinierade affärsnycklar och är långsammare än append för stora volymer
- Partitionera efter datum — det möjliggör effektiv pruning och gör rensnings-/bevarandepolicyer enklare att implementera
Datastyrning
- Markera PII-fält som
sensitive: 1i sourcefile-strukturen - Använd
excludeFromProfiling: 1för fält som inte ska analyseras - Tilldela
fieldDomain-klassificeringar för efterlevnadsspårning - Exkludera interna/felsökningsfält med
excludeField: 1för att hålla publicerad data ren
DWA-lagret är där rådata blir strukturerad affärskunskap. Det hanterar datamodellering, källa-till-mål-mappning, transformationer och relationshantering.
Trestegs modellstrategi
┌─────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ Stage Model │ ──►│ Base Model │ ──►│ Core Model │
│ (Normalize) │ │ (Integrate) │ │ (Consume) │
└─────────────┘ └──────────────────┘ └──────────────────┘
Stage Model (Normalisering)
- Syfte: Standardisera rådata från olika källor till ett gemensamt format
- Vad som händer här: Kolumnomdöpning, datumformatnormalisering, datatypstvång
- Konfiguration:
stageModelName,stageModelSchema,stageModelColumni Settings
Base Model (Ensemble / Integration)
- Syfte: Sammanfoga data från flera källor med konsekventa affärsregler
- Vad som händer här: Deduplicering, affärsnyckelsmatchning, käll-övergripande konsolidering
- Konfiguration:
baseModelName,baseModelSchemai Settings
Core Model (Integrated / Konsumtion)
- Syfte: Slutgiltiga, rena affärsentiteter redo för analys och rapportering
- Vad som händer här: Publicera enhetliga
Customer,Order,Product-tabeller - Konfiguration:
coreModelName,coreModelSchemai Settings
Dessutom kan Datamart-modeller konfigureras för specifika analytiska användningsfall via datamartModelNames och datamartModelSchemas i Settings.
Skapa modeller
En modell representerar en måltabell i lagret. Varje modell har:
| Egenskap | Beskrivning |
|---|---|
object | Unikt modellnamn |
alias | Visningsnamn |
description | Affärssyfte |
objectType | Specific (enskild källa) eller Combined (flerkälla) |
loadingPattern | Hur data laddas (se nedan) |
attributes | Kolumner/fält med typer och nycklar |
relationships | Främmande nycklar till andra modeller |
Laddningsmönster
| Mönster | Beteende | När det ska användas |
|---|---|---|
full | Ersätt hela tabellen vid varje laddning | Små dimensioner, referensdata |
incremental | Lägg bara till nya/ändrade poster | Stora faktatabeller, händelseloggar |
transaction | Varje rad är en oföränderlig händelse | Finansiella transaktioner, revisionsloggar |
dayspan | Partitionera efter datumintervall | Tidsseriedata, dagliga ögonblicksbilder |
none | Ingen automatiserad laddning | Manuell eller externt hanterad |
Modellattribut
Attribut definierar kolumnerna i din modell:
| Egenskap | Beskrivning |
|---|---|
attribute | Kolumnnamn |
alias | Visningsnamn (valfritt) |
dataType | Varchar, Integer, Decimal, Boolean, Time, Date, Timestamp |
isBusinessKey | Y / N — är detta del av den unika identifieraren? |
businessKeyOrder | Prioritet i sammansatta nycklar (1, 2, 3…) |
description | Affärsdefinition |
Affärsnycklar
Affärsnycklar identifierar unikt en post och är kritiska för deduplicering och upsert-operationer.
Tips:
- Markera attribut som affärsnycklar med
isBusinessKey: "Y" - Använd
businessKeyOrderför att definiera prioriteten i sammansatta nycklar - Dra rader för att ändra nyckelprioritet i UI:t
- Mappa affärsnycklar före attribut — de måste finnas innan beroende mappningar
Exempel — Sammansatt affärsnyckel:
Customer model:
#1 SystemCode (businessKeyOrder: 1)
#2 CustomerID (businessKeyOrder: 2)
Mappningar — Källa till mål
Mappningar kopplar sourcefilefält till modellattribut. De är kärnmekanismen för datatransformation i DWA.
Mapping Properties
| Egenskap | Beskrivning |
|---|---|
source | Källfältsreferens |
target | Målmodellattribut |
isKeyMapping | Yes = affärsnyckelsmappning |
keyOrder | Nyckelprioritetsordning |
filter | SQL WHERE-villkor för denna mappning |
optionalCalculation | SQL-uttryck för transformation |
sortOrder | Sorteringsprioritet (negativt = ASC, positivt = DESC) |
useFieldNameAsValue | Yes = använd fältnamnet självt som värde |
mappingNumber | Gruppidentifierare för multi-mappningsscenarier |
Mappningstyper
| Typ | Visuell indikator | Beskrivning |
|---|---|---|
| Nyckelmappning | Teal, animerad | Affärsnyckel — mappar till unik identifierare |
| Beräkningsmappning | Grön | Inkluderar en SQL-transformation |
| Relationsmappning | Lila | Mappar till en främmande nyckelrelation |
| Standardmappning | Grå | Enkel fält-till-attribut-länk |
Transformationer
Valfria beräkningar
Tillämpa SQL-uttryck för att transformera data under mappning:
-- Normalisering av skiftläge
UPPER(CustomerName)
-- Strängmanipulation
LEFT(OrderDate, 10)
CONCAT(FirstName, ' ', LastName)
-- Numeriska beräkningar
ROUND(PriceUSD / 1.08, 2)
Amount * 0.25
-- Villkorslogik
CASE WHEN Status = 'A' THEN 'Active' ELSE 'Inactive' END
-- Datumformatering
TO_DATE(TransactionDate, 'YYYY-MM-DD')
Beräkningar använder måldatabasens SQL-dialekt. Fältnamn är skiftlägeskänsliga och måste matcha källan exakt.
Filter
Tillämpa radnivåvillkor för att inkludera/exkludera poster för en specifik mappning:
-- Bara icke-null-värden
IS NOT NULL
-- Mönstermatchning
LIKE 'ACTIVE%'
-- Numeriska jämförelser
> 0
-- Likhet
= 'SALE'
Varje filter gäller för ett enskilt källfält. För flera villkor, skapa separata mappningsposter.
Sorteringsordning
Styr postordning för CDC- och versioneringsscenarier:
| Värde | Riktning | Användningsfall |
|---|---|---|
Positivt (t.ex. 1) | Fallande | Senaste först (typiskt för LoadDate) |
Negativt (t.ex. -2) | Stigande | Äldsta först |
0 | Ingen sortering | Standard |
Använd fältnamn som värde:
När useFieldNameAsValue: "Yes", används det bokstavliga fältnamnet som datavärde istället för fältets innehåll. Användbart för typindikatorer och enum-liknande kolumner.
Relationer (främmande nycklar)
Modeller kan referera andra modeller genom relationer:
| Egenskap | Beskrivning |
|---|---|
toObject | Målmodell |
toAttribute | Målattribut (den refererade nyckeln) |
relationType | 1:N (en-till-många) eller M:M (många-till-många) |
relationRole | Beskriver relationens roll |
Visuella indikatorer i mappningsdiagrammet:
- Lila kanter med
REL-märke för relationsmappningar - 1:N visas som lila streckade linjer
- M:M visas som magenta streckade linjer
Modelleringsscenarier
Flerkälla-kundmaster
Du har kunddata i Salesforce, Marketo och ditt ERP. Mål: enhetlig Customer-modell.
Steg 1 — Stage Model (normalisera varje källa):
Salesforce: Contact.FirstName → Stage.FirstName (UPPER(FirstName))
Marketo: Lead.first_name → Stage.FirstName (UPPER(first_name))
ERP: CUST.FNAME → Stage.FirstName (UPPER(FNAME))
Steg 2 — Base Model (integrera med dedup):
Business Key: CustomerID (mappad från varje källas unika ID)
Filter: IS NOT NULL (exkludera test/ofullständiga poster)
Loading Pattern: incremental
Steg 3 — Core Model (slutgiltig dimension):
Business Key: CustomerID (sammansatt vid behov)
ValidFrom: LoadDate (validFrom=1, sortOrder=1 för DESC)
Loading Pattern: incremental med CDC
Tidigt anländande data (mastern ännu inte laddad)
Transaktioner anländer normalt före den masterdata de pekar på — en order för en kund som ännu inte finns i kundextraktet, ett ärende för en tillgång som registrerats i ett system med långsammare schema. Transaktionen hålls inte tillbaka, avvisas inte och parkeras inte för lagning.
Så fungerar det:
- Relationer bärs av affärsnyckeln, inte av en surrogatnyckel som slås upp vid laddning. Barnposten lagrar förälderns affärsnyckel, så referensen är komplett i samma stund som barnet landar.
- Föräldramodellen får en post för den nyckeln direkt, med nyckeln och ingenting annat. Relationen går ihop; det är bara de beskrivande attributen som saknas.
- När masterkällan laddas fäster dess attribut på samma affärsnyckel. Den nyckelbärande posten blir en fullständig post — samma nyckel, samma relationer, nu med sina attribut.
- Eftersom kärnan är historiserad blir kompletteringen en ny version i stället för en överskrivning. När masterdatan blev känd förblir synligt och spårbart.
Dag 1 Order 5591 → Kund "C-4417" Kund C-4417: endast nyckel, inga attribut
Dag 3 Kundmastern laddas Kund C-4417: namn, segment, adress
Order 5591 oförändrad — den var aldrig fel
Ingen manuell inblandning: barnladdningen körs inte om, inget avstämningsjobb löser nycklar i efterhand, och det finns ingen platshållarpost att leta rätt på och städa bort.
| Fråga | Svar |
|---|---|
| Misslyckas eller väntar transaktionen? | Varken eller. Den laddas, med relationen intakt |
| Måste jag köra om något när mastern kommer? | Nej — nästa masterladdning kompletterar posten |
| Hur ser jag vad som fortfarande saknas? | En post som bär en affärsnyckel utan attribut |
| Upprätthållna främmande nycklar? | Den nyckelbärande föräldraposten är det som gör barnladdningen tillåten på mål som upprätthåller främmande nycklar — se målplattformar |
En QPI-kontroll skriven som "noll föräldralösa" rapporterar väntande nycklar som ett fel så länge mastern är utestående. Där tidigt anländande data är normalt bör kontrollen avgränsas till nycklar som är äldre än masterkällans eget schema, i stället för till varje oupplöst nyckel.
Hierarkisk JSON med nästlade arrayer
Källa: API som returnerar kunder med inbäddade orderarrayer.
Sourcefile-struktur:
Level 0 (OBJECT): Root
├── customer.id (keyFieldIndicator=1)
├── customer.name
└── customer.loadDate (validFrom=1)
Level 1 (LIST): orders (useForSplittingRecords=1)
├── order.orderId
├── order.amount
└── order.status
Mappningsstrategi:
customer.id → Customer.CustomerKey(isKeyMapping=Yes)customer.name → Customer.Namecustomer.loadDate→ sortera DESC för senaste versionorder.orderId → Order.OrderKey(isKeyMapping=Yes)order.status→ filter!= 'CANCELLED'customer.id → Order.CustomerID(relationsmappning)
Beräknade fält
Källa: Rå försäljningsdata som behöver affärsberäkningar.
| Källfält | Målattribut | Beräkning |
|---|---|---|
amount | TaxAmount | amount * 0.10 |
priceUSD | PriceEUR | ROUND(priceUSD / 1.08, 2) |
transactionType | TransactionType | filter: = 'SALE' |
rawDate | TransactionDate | TO_DATE(rawDate, 'YYYY-MM-DD') |
SCD Typ 2 (Slowly Changing Dimension)
Spåra historiska ändringar av dimensionsposter.
Alla fält och relationer spårar historik som standard och är därmed kompatibla med SCD Typ 2.
Resultat: Varje ändring skapar en ny version. Sorteringsordningen säkerställer att den senaste versionen kan identifieras.
Hantering av känslig data
Hantera PII och styrningskrav i din modell.
| Fält | Konfiguration | Effekt |
|---|---|---|
ssn | sensitive: 1, excludeFromProfiling: 1 | Maskerad i profiler, flaggad som PII |
creditCard | sensitive: 1, excludeField: 1 | Exkluderad från mål helt |
email | sensitive: 1, fieldDomain: "PII" | Spårad för efterlevnad |
internalId | excludeField: 1 | Hoppad — behövs inte nedströms |
Batch-redigering
När du behöver tillämpa samma konfiguration på många fält, använd Batch Edit-panelen:
- Välj flera attribut med kryssrutor
- Tillämpa filter, beräkning, sorteringsordning eller fältnamnsinställningar i bulk
- Användbart för att tillämpa en gemensam transformation över en stor sourcefile
Mappningsdiagram
Det visuella mappningsdiagrammet ger en drag-och-släpp-yta för att skapa och granska mappningar:
Vyer och funktioner
Vyer:
- Tree View — traditionell hierarkisk redigerare för detaljerat fält-för-fält-arbete
- Diagram View — React Flow-baserad yta som visar hela mappningsbilden
Diagramfunktioner:
- Färgkodade kanter efter mappningstyp (nyckel, beräkning, relation, standard)
- Beroendegraf — orange ramar markerar fält involverade i beräkningsformler
- Sök och filtrera — hitta fält efter namn, sökväg eller datatyp med auto-zoom
- Exportera — ladda ner som PNG (1920×1080) eller SVG-vektor med tidsstämpel
- Minikarta — översikt av hela mappningsstrukturen
Bästa praxis
Modelldesign
- Börja med affärsnycklar — definiera unika identifierare innan du lägger till attribut
- Använd sammansatta nycklar sparsamt — 2–3 fält max för underhållbarhet
- Skriv tydliga beskrivningar — de fungerar som dokumentation för nedströmskonsumenter
- Välj laddningsmönster noggrant —
fullför små tabeller,incrementalför stora
Mappningsstrategi
- Mappa nycklar först, attribut sedan — affärsnycklar måste finnas innan beroende mappningar
- Använd beräkningar för normalisering — standardisera format (datum, skiftläge) på mappningsnivå
- Tillämpa filter på mappningsnivå — inte i exportens WHERE-klausul — för modellspecifika exkluderingar
- Gruppera relaterade mappningar — använd
mappingNumberför att organisera multi-mappningsscenarier
Prestanda och styrning
- Undvik övermappning — mappa bara fält som faktiskt behövs i modellen
- Använd excludeField — ta bort bruskolumner innan de går in i modelleringspipelinen
- Profilera selektivt — exkludera högvolym, välförstådda fält från profilering
- Flagga känsliga fält tidigt — markera PII i sourcefile-strukturen, inte som en eftertanke
- Tilldela fältdomäner — använd klassificeringskategorier för efterlevnadsspårning
- Dokumentera relationer — lägg till
relationRole-beskrivningar för att förklara varför modeller är länkade
QPI-lagret ger kontinuerlig övervakning av din dataplattforms hälsa. Det spårar mappningstäckning, fältnivåstyrning, dataprofilering och pipelinefullständighet — och ger dig en samlad bild för datakvalitet.
Plattformsnivåmått
Dashboarden visar fem nyckelräknare som ger en omedelbar pulskontroll:
| Mått | Vad det mäter | Varför det är viktigt |
|---|---|---|
| Systems | Totalt anslutna källsystem | Är alla förväntade källor registrerade? |
| Source Files | Totalt sourcefile-definitioner | Är alla förväntade dataflöden definierade? |
| Fields | Totalt fält över alla sourcefiles | Är datakontraktet komplett? |
| Mappings | Totalt källa-till-modell-mappningar | Är källor anslutna till lagret? |
| Models | Totalt lagermodeller | Är målschemat helt definierat? |
En plötslig minskning i någon räknare kan indikera ett konfigurationsproblem eller oavsiktlig radering.
Mappningstäckning
Den viktigaste kvalitetsindikatorn. Mappningstäckning mäter vilken procentandel av en sourcefils fält som är mappade till en modell.
Beräkning: coverage = (mappedFieldCount / fieldCount) × 100
| Täckning | Status | Visuell | Betydelse |
|---|---|---|---|
| 80–100% | Frisk | Grön | De flesta fält är mappade och modellerade |
| 40–79% | Varning | Gul | Betydande omappade fält — granskning behövs |
| 0–39% | Kritisk | Röd | Mestadels omappad — troligen ofullständig uppsättning |
Var det syns:
- Data Lineage Flow — kanter mellan sourcefiles och modeller är färgkodade efter täckning
- Sourcefile-noder — framstegsbalkar visar täckningsprocent per fil
- Animerade kanter — anslutningar under 80% täckning animeras för att dra uppmärksamhet
Anslutningshälsa
Varje källsystems anslutningstyp och exportstatus övervakas:
| Indikator | Värden | Vad man ska titta på |
|---|---|---|
| Anslutningstyp | DB, API, File, Custom, Manual | Saknade anslutningar visas som "undefined" |
| Har exporter | Ja / Nej | System utan exporter producerar ingen data |
| Exportantal | Antal konfigurerade exporter | Förvänta minst en per aktivt system |
I arkitekturdiagrammet ansluter system med exporter via heldragna pilar genom Ingest Agent, medan system utan exporter ansluter med streckade pilar (direktöverföring).
Fältnivåstyrning
Varje fält i en sourcefile bär styrningsflaggor som fungerar som kvalitetsindikatorer:
| Flagga | Syfte | Övervaka för |
|---|---|---|
keyFieldIndicator | Markerar primär-/affärsnycklar | Saknade nycklar = ingen deduplicering möjlig |
sensitive | Flaggar PII/känslig data | Otaggad PII = efterlevnadsrisk |
excludeField | Tar bort fält från pipeline | Överexkludering kan tappa nödvändig data |
excludeFromProfiling | Hoppar över kvalitetskontroller | För många exkluderingar = blinda fläckar |
validFrom | SCD Typ 2-versioneringsfält | Saknas = ingen historisk spårning |
fieldDomain | Styrningsklassificering | Oklassificerade fält = styrningslucka |
Flaggorna är inte bara indikatorer — de är instruktioner. Generatorn läser dem när den bygger måltabellerna: keyFieldIndicator blir en primärnyckel på publiceringstabellen och ett unikt villkor på core-tabellen, fieldDomain blir en kategoritagg på kolumnen, sensitive blir en känslighetstagg och, på plattformar som stödjer det, en kolumnmask. Ett fält som klassificerats en gång på källan är klassificerat överallt plattformen bär det vidare, även på de normaliserade barntabeller som ärver dess nyckel.
Det är därför ett oklassificerat fält är en styrningslucka snarare än en dokumentationslucka: ingenting nedströms hittar på klassificeringen åt dig, och ingenting applicerar den i efterhand på tabeller som redan skapats.
Dataprofilering
Vad profilering validerar
När enableProfiler är aktivt på en sourcefile kör systemet kontinuerliga kvalitetskontroller mot datakontraktet:
- Datatypöverensstämmelse (är heltal verkligen heltal?)
- Null/tomma fältkvoter
- Värdefördelningmönster
- Schemadriftdetektering (nya eller saknade kolumner)
Konfiguration:
- Aktivera per sourcefile via
enableProfiler: 1 - Exkludera specifika fält med
excludeFromProfiling: 1 - Resultat skrivs till Profile Zone i DLS-pipelinen
Avvägningar:
- Profilering ökar beräkningsresursanvändningen
- Inaktivera för högvolym, välförstådda, stabila källor
- Aktivera alltid för nya integrationer tills datakontraktet är validerat
Modellrelationer
Data Lineage Flow spårar hur modeller kopplas till varandra:
| Relationstyp | Visuell | Vad man ska övervaka |
|---|---|---|
| 1:N (One-to-Many) | Lila streckade linjer | Saknade = isolerade modeller utan kopplingar |
| M:M (Many-to-Many) | Magenta streckade linjer | Överdrivet = möjligt modelleringsproblem |
Additional Tasks (utökad övervakning)
Konfigurera för- och efterbearbetningsuppgifter
För övervakningsbehov bortom inbyggda indikatorer, konfigurera Additional Tasks:
| Egenskap | Beskrivning |
|---|---|
Name | Uppgiftsidentifierare |
Type | pre (före huvudbearbetning) eller post (efter) |
RunCommand | Körbart kommando att köra |
Dependency[] | Andra uppgifter som måste slutföras först |
SortOrder | Exekveringssekvens |
Användningsfall:
- Datafärskhekskontroller — verifiera att data anlände inom förväntade tidsfönster
- Radantalvalidering — jämför faktiska mot förväntade postantal
- Schemadriftdetektering — varna när k ällstruktur ändras oväntat
- Tröskelvarningar — flagga när mått överskrider acceptabla gränser
- Efterladdningsaggregering — beräkna sammanfattande statistik efter varje laddning
Dashboards och visualiseringar
Arkitekturdiagram
Den end-to-end pipelinevisualiseringen som visar alla fyra lager:
Datakällor (grå) → Ingest (teal) → DLS (blå) → DWA (lila)
Vad man ska övervaka:
- Finns alla förväntade system?
- Har alla system anslutningar och exporter?
- Är hela pipelinekedjan intakt (inga trasiga länkar)?
Data Lineage Flow
En detaljerad vy som visar hur data flödar från system genom sourcefiles till modeller:
System → Sourcefiles → Modeller → Relaterade modeller
Trekolumnslayout:
- Vänster: Källsystem med sourcefile-antal
- Mitten: Sourcefiles med täckningsframstegsbalkar
- Höger: Målmodeller med attributantal och relationer
Vad man ska övervaka:
- Röda/gula kanter som indikerar låg mappningstäckning
- Animerade kanter som drar uppmärksamhet till ofullständiga mappningar
- Föräldralösa modeller (inga inkommande mappningar)
- Föräldralösa sourcefiles (inga utgående mappningar)
Källdetaljpanel
Klicka på valfritt system i arkitekturdiagrammet för att se:
- Anslutningstyp och status
- Alla sourcefiles för det systemet
- Fältantal per sourcefile
- Mappningsantal per sourcefile
- Expanderbar sökvägstruktur med fältdetaljer
Övervakningschecklistor
Dagliga kontroller
| Kontroll | Var | Vad man ska leta efter |
|---|---|---|
| Plattformsräknare | Dashboard Stats | Oväntade minskningar i någon räknare |
| Mappningstäckning | Data Lineage Flow | Nya röda/gula kanter |
| Systemanslutningar | Arkitekturdiagram | Saknade eller trasiga anslutningar |
| Exportstatus | Arkitekturdiagram | System utan exporter (streckade linjer) |
Veckovisa kontroller
| Kontroll | Var | Vad man ska leta efter |
|---|---|---|
| Styrningtäckning | Field Editor | Fält som saknar sensitive eller fieldDomain-flaggor |
| Profileringsresultat | Profile Zone | Anomalier i datatypöverensstämmelse eller nullkvoter |
| Modellfullständighet | Model Editor | Modeller med få eller inga attribut |
| Relationshälsa | Data Lineage Flow | Föräldralösa eller frånkopplade modeller |
Vid ny integration
| Steg | Åtgärd |
|---|---|
| 1 | Verifiera att systemet visas i arkitekturdiagrammet |
| 2 | Bekräfta att anslutningstypen är korrekt |
| 3 | Kontrollera att exporter är konfigurerade och schemalagda |
| 4 | Aktivera enableProfiler på alla nya sourcefiles |
| 5 | Markera känsliga fält med sensitive: 1 |
| 6 | Tilldela fieldDomain-klassificeringar |
| 7 | Skapa mappningar och verifiera att täckningen når 80%+ |
| 8 | Validera profileringsresultat efter första laddning |
Bästa praxis
Täckningsmål
| Sourcefile-typ | Måltäckning | Motivering |
|---|---|---|
| Kärnaffärsdata (kunder, ordrar) | 90–100% | Kritisk för analys |
| Referens-/dimensionsdata | 80–100% | Behövs för kopplingar och uppslagningar |
| Händelse-/loggdata | 60–80% | Många fält kan vara metadata/brus |
| Staging-/temporära källor | 40–60% | Kan vara delvis relevant |
Profileringsstrategi
- Aktivera som standard för alla nya sourcefiles
- Inaktivera selektivt för stabila, högvolymkällor efter validering
- Inaktivera aldrig för källor med PII — efterlevnad kräver löpande validering
- Exkludera specifika fält istället för att inaktivera profilering helt
Styrningsprioriteringar
- Tagga PII först —
sensitive: 1på alla personligt identifierbara fält - Klassificera fält — tilldela
fieldDomainför efterlevnadsspårning - Definiera affärsnycklar — varje modell behöver minst en
- Dokumentera relationer — lägg till beskrivningar för att förklara varför modeller är länkade
- Granska exkluderingar — se till att
excludeFieldinte döljer nödvändig data