Skip to content

Pipeline: movimenti-per-conto ​

  • Scopo: esempio di riferimento per le transform di file e di ordinamento in mezzo al grafo: parse, sort e serialize. Da estratti conto in CSV, con i movimenti di più conti mescolati, un CSV per conto con i movimenti in ordine di data.
  • Owner: — (esempio di piattaforma)
  • Cadenza: on-demand. Il dataset è di prova e sta in memoria: la pipeline non tocca sistemi esterni e non legge l'ambiente.
  • Runbook: nessuno, è una demo.

Flusso dati ​

0/5
estratti — source memory estrattisourcememory righe — transform righetransform movimenti — transform movimentitransform ordina — transform ordinatransform componi-file — transform componi-filetransform file-per-conto — sink memory file-per-contosinkmemory scarti — dead-letter memory scartidead-lettermemory
Lo scopo dei nodi
NodoTipoScopo
estrattisourceLegge gli estratti conto di prova della dimostrazione, ognuno un file CSV con i movimenti di più conti.
righetransformApre ogni estratto e ne ricava i movimenti, uno per riga, ricordando da quale file e da quale riga viene ciascuno. Un file che non si legge finisce per intero fra gli scarti.
movimentitransformControlla che ogni movimento abbia conto, data e importo validi. Un movimento fuori regola finisce fra gli scarti, e gli altri proseguono.
ordinatransformMette i movimenti in ordine di conto e, per ogni conto, di data, così ogni file per conto li elenca dal più vecchio.
componi-filetransformScrive un file CSV per conto, con i suoi movimenti in ordine e gli importi con due decimali.
file-per-contosinkConsegna i file per conto, uno per ciascun conto che compare negli estratti.
scartidead-letterRaccoglie i record scartati dai nodi di questa pipeline, ognuno con il motivo dello scarto.

Il grafo è una catena; lo scopo di ogni nodo è nella tabella sotto il grafo. Qui il dettaglio tecnico:

  • righe — parse con csvCodec({ delimiter: ";" }): i byte arrivano dal record (bytes), non da fileSource, ed è il caso di una cartella Noeva o di un allegato di posta. La decodifica non fa IO, quindi resta una transform pura. merge porta nella riga il nome del file e il numero di riga. Con emit: "atomic", il default, le righe di un file escono solo a decodifica finita: un errore porta il file intero nella dead-letter, con fileName, rowNumber e line nei details, e non lascia righe a metà.
  • movimenti — validate con movimentoSchema, con la dead-letter scarti.
  • ordina — sort su due chiavi, conto e data, stabile. È stateful: trattiene tutto lo stream fino alla fine, con il tetto maxRecords obbligatorio (100 000), e non ha dead-letter.
  • componi-file — serialize con groupBy per conto: un file per gruppo, a fine stream, nell'ordine di prima comparsa della chiave. Dopo il sort i file escono in ordine di conto. row porta l'importo a stringa con due decimali, toOutput compone il record del file.

Sorgenti ​

  • estratti: due estratti conto di prova, in memoria, ognuno con l'header conto;data;descrizione;importo e i movimenti di due conti. Uno dei movimenti ha un importo che non è un numero.

Sink ​

  • file-per-conto: un record per conto, con il nome del file (movimenti-<conto>.csv), il numero di movimenti e i byte del CSV. In una pipeline vera qui c'è un sink di file, per esempio una cartella Noeva.
  • scarti: la dead-letter di righe e movimenti, con l'envelope DeadLetter di ogni file o riga scartati.

Idempotenza ​

I byte dipendono solo dagli estratti: lo stesso ingresso dà gli stessi file, nello stesso ordine. Un sink di file che sovrascrive per nome, o che salta un upload con gli stessi byte come noevaFileSink in new-version, rende sicura la riesecuzione.

Contratti (schema Zod) ​

  • movimentoSchema: file, riga, conto, data, descrizione, importo (con coercizione da stringa, perché il CSV non ha tipi).
  • filePerContoSchema: le colonne del record in uscita da componi-file, per il DAG.

Gestione errori ​

CasoDove finisceEsito della run
Un file che non si decodificascarti, per intero, con fileName e rowNumberpartial
Una riga fuori contrattoscarti, la riga solapartial
Più movimenti di maxRecordsla run si ferma: niente ordinamento a metàfailed

Senza un sink di scarto, i primi due casi fermano la run.

Parametri ed env ​

Nessuno: il dataset è in memoria.

Test ​

pipeline.test.ts copre i file per conto in ordine di data, una riga scartata, un file che non si decodifica e la riesecuzione con gli stessi byte.

Versioni ​

v12026-10-18 · ETL-206
Aggiunte
  • Versione iniziale: esempio di riferimento per `parse`, `sort` e `serialize`, su estratti conto di prova in memoria

Prima versione: non c'è una versione precedente da confrontare.

Noeva è un marchio registrato di 4D S.R.L.