Passa al contenuto principale
Sanità e bioscienze

Ti presentiamo Funke: parsing HL7v2 nativo su Databricks

Un acceleratore open source che trasforma i messaggi HL7v2 grezzi in dati interrogabili nativi per Spark, senza conversione FHIR o appiattimento di terze parti.

di Sean Fischer, Chris Mantz e Andy Launchbury

  • Funke esegue il parsing dei messaggi relativi alle cartelle cliniche elettroniche HL7v2 direttamente in tipi Spark nativi su Databricks Lakehouse, preservando l'intera gerarchia di segmenti, campi, componenti e sottocomponenti del messaggio originale.
  • È il successore di Smolder, la nostra libreria Scala del 2021, riscritta in Python e PySpark attorno a Unity Catalog, Declarative Automation Bundles e Spark Declarative Pipelines.
  • Funke è open source e include una demo eseguibile, consentendoti di configurare una pipeline di ingestione HL7 end-to-end ed esplorare i dati clinici analizzati in pochi minuti.

Il problema di HL7v2 nel lakehouse

HL7v2 è lo standard di messaggistica che gestisce in background il settore sanitario. È il modo in cui i sistemi clinici comunicano tra loro il ricovero di un paziente, l'invio di un ordine di laboratorio o la disponibilità di un referto. A distanza di decenni dalla sua introduzione, rimane lo standard di integrazione più ampiamente diffuso nel settore e la gran parte delle strutture sanitarie ne dipende ancora per il flusso quotidiano di dati operativi.

È anche complesso da gestire. Un messaggio HL7v2 è una struttura annidata codificata tramite delimitatori: segmenti composti da campi, campi composti da componenti e ripetizioni, componenti composti da sottocomponenti, tutti separati da un ridotto insieme di caratteri speciali dichiarati nel messaggio stesso all'interno dell'intestazione. La specifica lascia spazio alla flessibilità, quindi i messaggi reali variano da un sistema mittente all'altro.

Quando i team desiderano questi dati in un formato moderno, di solito ricorrono a una di due soluzioni temporanee. Convertono prima tutto in FHIR, il che aggiunge un livello di traduzione e può eliminare dettagli che non hanno mai avuto un equivalente diretto in FHIR. Oppure affidano i messaggi a un motore di terze parti che appiattisce la gerarchia in tabelle ampie, il che comporta costi aggiuntivi per un altro fornitore, lo spostamento dei dati fuori dalla piattaforma e la perdita dell'accesso diretto alla struttura granulare sottostante. Entrambe le opzioni aumentano i costi, introducono latenza e creano distanza tra l'utente e i propri dati clinici.

Da Smolder a Funke

Nel 2021 abbiamo reso open source Smolder, una libreria Spark che caricava i messaggi HL7v2 nei DataFrame, consentendo ai team sanitari di eseguire analisi su feed EHR in tempo reale senza dover scrivere parser manualmente. Smolder ha reso possibile l'uso dei dati HL7 nel lakehouse in un momento in cui l'analisi dei messaggi rappresentava una delle principali barriere all'adozione.

Da allora la piattaforma ha fatto grandi progressi. Unity Catalog gestisce dati, volumi e modelli. I Declarative Automation Bundles impacchettano e distribuiscono i progetti come codice. Le Spark Declarative Pipelines gestiscono l'ingestione in streaming in modo dichiarativo. Smolder, tuttavia, è antecedente a tutto questo e non è stato progettato per integrarsi in modo lineare con la moderna piattaforma Databricks.

Funke è il suo successore, riprogettato per la piattaforma attuale. Il nome è un piccolo omaggio alle sue origini: Funke in tedesco significa spark. Se Smolder era un'origine dati Scala, Funke è una libreria Python e PySpark unita a una pipeline pronta per l'uso. Esegue il parsing verso tipi Spark nativi, viene distribuito come DAB, esegue l'ingestione tramite una Declarative Pipeline e archivia tutto in Unity Catalog. Gli utenti possono creare da zero una pipeline HL7 scalabile e in streaming in pochi minuti.

L'idea avviata da Smolder, ovvero considerare HL7 come dati di prim'ordine nel lakehouse, rimane la stessa. Ciò che cambia è l'implementazione.

Cosa rende Funke diverso

Funke analizza un messaggio HL7v2 direttamente in un tipo Spark nativo mantenendo intatta l'intera gerarchia. Il parsing è progettato per essere senza perdita di dati, con l'obiettivo di conservare tutta la struttura originale il più a lungo possibile nella pipeline.

Un messaggio sottoposto a parsing viene modellato come una mappa che associa il nome del segmento alle relative ripetizioni. Ogni campo è a sua volta una mappa, indirizzabile per numero di campo, poi ripetizione, componente e sottocomponente. In termini di Spark:

Poiché il messaggio sottoposto a parsing è una normale colonna Spark, ogni elemento è raggiungibile con le consuete espressioni DataFrame o SQL, mentre il parser gestisce le regole di codifica HL7: i separatori di campo, componente, ripetizione e sottocomponente dichiarati nell'intestazione MSH, oltre alle sequenze di escape standard. Funke supporta ogni tipo e versione di messaggio HL7, consentendo alla stessa pipeline di accettare messaggi provenienti dall'intero intervallo di versioni solitamente ricevute da un sistema sanitario.

Di conseguenza, i dati clinici grezzi arrivano nel lakehouse mantenendo la massima fedeltà, gestiti da Unity Catalog e pronti per le query. Sarete voi a decidere quali campi sono importanti per uno specifico caso d'uso, anziché accettare la struttura scelta da un convertitore o da un fornitore esterno.

Come funziona: la pipeline di ingestione

Funke viene distribuito come Declarative Pipeline che segue l'architettura medallion. Definisce due tabelle, sulle quali è possibile costruire tabelle Gold per i propri casi d'uso specifici.

Figura 1: Flusso di dati di Funke su Databricks Lakehouse

image1.png

Da landing a bronze. I nuovi file HL7 arrivano in un volume Unity Catalog. Auto Loader li acquisisce, ne decodifica il contenuto e li scrive nella tabella raw_messages insieme ai metadati di ingestione, tra cui un hash MD5 per tracciare il messaggio lungo la pipeline, un timestamp di inserimento e un ID messaggio.

Da bronze a silver. La tabella parsed_messages legge lo stream grezzo e applica il parser di Funke, aggiungendo una singola colonna hl7 del tipo nativo mostrato sopra. È qui che il testo non strutturato del messaggio diventa un dato strutturato e interrogabile.

Da un messaggio grezzo a una tabella gold

Poiché la colonna hl7 è costituita da dati Spark nativi, è possibile indirizzare direttamente qualsiasi elemento per segmento, campo, ripetizione, componente e sottocomponente:

La stessa estrazione funziona in Spark SQL, consentendo agli analisti che non utilizzano Python di creare direttamente tabelle e viste Gold:

Le catene di indici posizionali sono precise, ma risultano difficili da interpretare mesi dopo lo sviluppo. Per questo motivo Funke include helper di accesso che aiutano gli sviluppatori a estrarre il contenuto in modo lineare. get_value accetta il segmento, la relativa ripetizione, il campo, la ripetizione del campo, il componente e il sottocomponente, e restituisce il valore sotto forma di colonna:

Sono presenti anche helper di livello superiore, tra cui get_segment, get_field, get_component, get_subcomponent e un helper parse_hl7_version che legge la versione direttamente dall'intestazione MSH. Sarete voi a scegliere il livello di astrazione più adatto alla query.

Guarda l'esecuzione end-to-end

Funke include una demo che permette di osservare l'intero flusso senza dover collegare un feed EHR reale. Include un generatore sintetico di eventi ADT che simula ricoveri, trasferimenti e dimissioni in diverse strutture, oltre a un'app di controllo, basata su Databricks Apps, che avvia e interrompe lo stream degli eventi e traccia un messaggio dal testo grezzo alla struttura analizzata fino al livello Gold.

image2.gif

Il layer gold della demo è un esempio pratico a tutti gli effetti. Converte il flusso ADT analizzato in una tabella di cronologia adt_events, quindi mantiene una tabella current_census live utilizzando il Change Data Capture basato sul numero di visita, in modo che un evento di dimissione rimuova un paziente dal registro dei ricoveri e liberi il letto. Una tabella bed_utilization unisce il registro dei ricoveri live con la capacità della struttura per mostrare i letti occupati rispetto a quelli disponibili per unità, alimentando una dashboard. È un'illustrazione concreta del passaggio da messaggi HL7 grezzi a una metrica operativa che un ospedale monitorerebbe effettivamente.

Per iniziare

Funke è un acceleratore Databricks Industry Solutions, distribuito come Asset Bundle:

  1. Clona la repository nel tuo workspace Databricks.
  2. Apri la directory nell'editor DAB e fai clic su Deploy. La distribuzione crea la libreria funke e predispone per te la pipeline, lo schema Unity Catalog e il volume di destinazione.
  3. Carica i messaggi HL7 nel volume landing creato.
  4. Fai clic su Esegui sulla pipeline di inserimento HL7.

Se preferisci la riga di comando, la stessa distribuzione può essere eseguita con la Databricks CLI:

Che cos'è Funke e che cosa non è

Funke è un parser e un acceleratore di inserimento. Fornisce messaggi HL7v2 sotto forma di dati lakehouse nativi, gestiti e interrogabili, e un modello pulito per trasformarli nelle tabelle gold necessarie per i tuoi casi d'uso. Non è un motore di interfaccia e non sostituisce le competenze cliniche e HL7 necessarie per interpretare correttamente tali messaggi. La mappatura da un segmento e un campo a un concetto aziendale è una decisione da prendere in base alle proprie conoscenze del dominio. Il compito di Funke è garantire che, quando si prende tale decisione, i dati siano subito disponibili, completi e facili da raggiungere.

Provalo

Funke è open source sotto Licenza Databricks. Esplora il codice, esegui la demo e apri un issue con feedback o idee:

https://github.com/databricks-industry-solutions/funke-hl7v2

I messaggi di prova utilizzati nella demo provengono dal progetto HL7 v2-to-FHIR.

(Questo post sul blog è stato tradotto utilizzando strumenti basati sull'intelligenza artificiale) Post originale

Ricevi gli ultimi articoli nella tua casella di posta

Iscriviti al nostro blog e ricevi gli ultimi articoli direttamente nella tua casella di posta.