Volver al blog
TutorialMay 2, 202210 min

Maledetto quell'inferno dei formati dati

Gestire formati dati complessi e cambiamenti può essere scoraggiante. Scopri come layline.io affronta questa sfida utilizzando un linguaggio grammaticale configurabile.

Maledetto quell'inferno dei formati dati

Impostazione

Sei la persona incaricata di gestire e far funzionare l'infrastruttura di elaborazione dati presso ACME Corp. È quella complessa e delicata macchina che si occupa di tutto il lavoro pesante relativo ai dati nella tua azienda, ma che non riceve mai il riconoscimento che merita. È la pompa che non può smettere di pompare, è il carburante che fa andare avanti tutto.

Eppure, quando i tuoi genitori, amici o persino colleghi ti chiedono cosa fai alla ACME, si addormentano a metà della tua entusiastica spiegazione.

Ammettiamolo: non ricevi abbastanza credito per quello che fai per il mondo 🙃

Sfide

Il lavoro che fai non richiede di andare in giro con una tuta da meccanico, ma sicuramente sembra che tu debba osservare costantemente, riparare, correggere e semplicemente infondere nuova energia in quell'infrastruttura di elaborazione dati.

Anche se ci sono molte sfide quotidiane, una di queste riguarda il CAMBIAMENTO. Sì, non cambiare mai un sistema funzionante, dicono, ma non è così che va il mondo. Uno dei cambiamenti più frequenti è …

Cambiamento del formato dei dati

AAHHHH! Allarme rosso … sirene che suonano …! Quando si tratta di cambiamenti nel formato dei dati, spesso si presentano una serie di sfide contemporaneamente:

  1. Le interfacce dei dati sono spesso codificate in qualche codice sorgente. Non puoi semplicemente "cambiarle" (come suggerisce il capo), o almeno non è così semplice.
  2. Durante la migrazione, i dati vengono ricevuti sia nel vecchio che nel nuovo formato. Anche con un piccolo cambiamento, sono comunque due formati diversi che devono essere elaborati in parallelo.
  3. Non si tratta solo di un altro campo. A volte si tratta di un'intera struttura di dati aggiuntiva e di molte altre cose contemporaneamente.
  4. I dati modificati possono richiedere una gestione interna di informazioni aggiuntive, ecc. Ancora una volta, alcune cose potrebbero essere codificate e quindi il codice deve essere modificato per adattarsi.
  5. Hai finito il caffè. Questo non aiuta.

Abbiamo due grandi problemi qui, che sono:

  1. Cambiamento del codice e
  2. gestione della migrazione del formato.

Questo può risultare piuttosto complicato e richiedere lunghi cicli di pianificazione, sviluppo, rilascio, test e infine distribuzione.

Se solo ci fosse un modo migliore per fare tutto questo rapidamente e in modo semplice ...

Formati di dati generici in soccorso

layline.io offre Formati di dati generici che non possono risolvere tutte le sfide sopra menzionate, ma la maggior parte di esse, nella maggior parte dei casi.

Cosa sono i Formati di dati generici?

Come suggerisce il nome, questo concetto consente di definire i formati di dati in modo generico. Per farlo, fornisce:

  1. un linguaggio per definire la struttura (grammatica) del formato che stai cercando di gestire.
  2. Questo linguaggio utilizza espressioni regolari per definire e identificare singoli elementi di una struttura e poi
  3. sotto-elementi di quella struttura, ecc.
  4. È orientato agli oggetti, nel senso che puoi definire e riutilizzare strutture di elementi ovunque.

Come appare questo linguaggio?

Diamo un'occhiata. Per questo scopo lavoreremo con un formato di dati super semplice, che ha valori separati da virgole, deve avere un record di intestazione, da 1 a n record di dettaglio e un record di chiusura.

Esempio di dati di un semplice registro di transazioni bancarie:

H;Sample Bank Transactions
D;20-Aug-2021;NEFT;23237.00;00.00;37243.31
D;21-Aug-2021;NEFT;00.00;3724.33;33518.98
T;100

Ed ecco come questo formato è definito all'interno di layline.io utilizzando il linguaggio di grammatica generica:

format {
  name = "Bank Transactions" 
  description = "Random bank transactions"

  start-element = "File"
  target-namespace = "BankIn"

  elements = [
    // Sequenza File
    {
      name = "File"
      type = "Sequence"
      references = [
        { name = "Header", referenced-element = "Header" },
        { name = "Details", max-occurs = "unlimited", referenced-element = "Detail" },
        { name = "Trailer", referenced-element = "Trailer" }
      ]
    },
    // Record di intestazione 
    {
      name = "Header"
      type = "Separated"
      regular-expression = "H"
      separator-regular-expression = ";"
      separator = ";"
      terminator-regular-expression = "\n"
      terminator = "\n"
      mapping = { message = "Header", element = "BT_IN" }
      parts = [
        { name = "RECORD_TYPE", type = "RegExpr", regular-expression = "[^;\n]*", value.type = "Text.String" },
        { name = "FILENAME", type = "RegExpr", regular-expression = "[^;\n]*", value.type = "Text.String" }
      ]
    },
    // Record di dettaglio
    {
      name = "Detail"
      type = "Separated"
      // ... struttura simile
    },
    // Record di chiusura
    {
      name = "Trailer"
      type = "Separated"
      // ... struttura simile
    }
  ]
}

L'elemento format

Tutto inizia con l'elemento di livello superiore format:

Oltre a un name e una description, ha anche un array di elements. Questi elementi definiscono un certo numero di sotto-elementi (classi), che possono essere di tipi diversi.

L'elemento File di tipo Sequence

Questo elemento definisce una struttura logica di sotto-elementi nella sua struttura references:

Potresti notare che stiamo costruendo un albero qui:

Conclusione preliminare

Abbiamo appreso che il modo in cui funziona il linguaggio di grammatica è il seguente:

  1. Una grammatica è composta da un certo numero di elementi
  2. Questi elementi hanno tipi diversi che servono a scopi distinti
  3. L'elemento iniziale è format, che punta a un elemento di partenza
  4. Puoi definire un numero qualsiasi di elementi aggiuntivi
  5. Alcuni elementi possono quindi fare riferimento ad altri elementi

E per quanto riguarda altri formati più complessi?

Ecco cos'altro funziona:

  • Formati ASCII/Unicode molto complessi
  • Analisi condizionale dei dati attraverso la gestione dello stato del parser condizionale
  • Strutture binarie
  • Una combinazione di formati ASCII e binari

Crediamo che ciò copra oltre l'80% di tutti i formati di interscambio dati.

Supporto per formati multipli

Puoi definire tutti i formati che desideri. layline.io li compila tutti in un "super-formato" durante il runtime. Questo ti consente di:

  • fare riferimento a tutti i formati da qualsiasi punto
  • mappare i dati da un formato all'altro
  • creare nuove istanze di messaggi basate su un formato specifico
  • ingerire o esportare dati in uno qualsiasi dei formati definiti

Dove posso configurare tutto questo?

Abbiamo fornito un'interfaccia utente intuitiva per aiutarti a completare tutta la configurazione. Puoi trovarla nel Configuration Center basato sul web di layline.io sotto Project --> Formats --> Generic Format:

E non finisce qui. Mentre stai definendo la tua grammatica, puoi caricare un file di dati di esempio e vedere affiancati se la tua grammatica corrisponde alla struttura del file di dati:

Abbastanza interessante, vero?

Riferimento ai dati all'interno della logica

Una volta che hai definito una o più grammatiche all'interno di layline.io, puoi quindi accedere a singoli elementi e strutture al loro interno:

Esempio: Accesso ai dati all'interno di Mapping Asset

Esempio: Accesso ai dati all'interno di Javascript Asset

Gestione dei cambiamenti di formato

Guardando indietro alle sfide di cui abbiamo parlato all'inizio, dovrebbe ora essere più chiaro quanto sia facile adattarsi ai cambiamenti di formato.

  • Serve un altro campo? Basta aggiungerlo alla grammatica.
  • Serve un'intera nuova struttura di record? Ancora una volta, basta aggiungerla alla grammatica.
  • Devi gestire una vecchia e una nuova versione di un record di dettaglio contemporaneamente? Facile: puoi inserire un elemento Choice per consentire sia una versione Detail-Old che una versione Detail-New.
  • Hai bisogno di calcolare il contenuto in base ad altri contenuti? Basta aggiungere formule.

È tutto già previsto.

Risorse

#Descrizione
1Documentazione: Introduzione
2Documentazione: Generic Format Asset
3Progetto di esempio: Output to Kafka
Share:

Enjoyed this article?

Subscribe to get more insights delivered to your inbox.