Direkt zum Hauptinhalt

Wir stellen Funke vor: Natives HL7v2-Parsing auf Databricks

Ein Open-Source-Beschleuniger, der rohe HL7v2-Nachrichten ohne FHIR-Konvertierung oder Flattening von Drittanbietern in abfragbare, Spark-native Daten umwandelt.

von Sean Fischer, Chris Mantz und Andy Launchbury

  • Funke parst HL7v2-Nachrichten aus elektronischen Patientenakten direkt in native Spark-Typen auf dem Databricks Lakehouse und behält dabei die vollständige Hierarchie aus Segmenten, Feldern, Komponenten und Subkomponenten der Originalnachricht bei.
  • Es ist der Nachfolger von Smolder, unserer Scala-Bibliothek aus dem Jahr 2021, die in Python und PySpark rund um Unity Catalog, Declarative Automation Bundles und Spark Declarative Pipelines neu entwickelt wurde.
  • Funke ist Open Source und wird mit einer ausführbaren Demo geliefert, sodass Sie innerhalb weniger Minuten eine Ende-zu-Ende-HL7-Ingestion-Pipeline einrichten und geparste klinische Daten erkunden können.

Das HL7v2-Problem im Lakehouse

HL7v2 ist der Messaging-Standard, der im Hintergrund das Gesundheitswesen steuert. Über ihn teilen sich klinische Systeme gegenseitig mit, dass ein Patient aufgenommen wurde, eine Laboranforderung erstellt wurde oder ein Ergebnis vorliegt. Jahrzehnte nach seiner Einführung ist er nach wie vor der am weitesten verbreitete Integrationsstandard in der Branche, und die große Mehrheit der Pflegeorganisationen ist für den routinemäßigen Fluss operativer Daten weiterhin darauf angewiesen.

Allerdings ist die Arbeit damit auch kompliziert. Eine HL7v2-Nachricht ist eine verschachtelte, durch Trennzeichen codierte Struktur: Segmente bestehen aus Feldern, Felder aus Komponenten und Wiederholungen, Komponenten aus Subkomponenten – alle getrennt durch eine kleine Gruppe von Sonderzeichen, die die Nachricht selbst in ihrem Header deklariert. Die Spezifikation lässt Raum für Flexibilität, sodass sich Nachrichten aus der Praxis von Absendersystem zu Absendersystem unterscheiden.

Wenn Teams diese Daten in einem modernen Format haben möchten, greifen sie gewöhnlich zu einer von zwei Ausweichlösungen. Entweder konvertieren sie zuerst alles nach FHIR, was eine Übersetzungsebene hinzufügt und Details verwirft, die nie ein eindeutiges FHIR-Äquivalent hatten. Oder sie übergeben die Nachrichten an eine Drittanbieter-Engine, die die Hierarchie in breite Tabellen flachklopft. Das bedeutet, für einen weiteren Anbieter zu bezahlen, Daten aus der Plattform herauszubewegen und den direkten Zugriff auf die zugrunde liegende feingranulare Struktur zu verlieren. Beide Wege verursachen Kosten, erhöhen die Latenz und entfernen Sie von Ihren eigenen klinischen Daten.

Von Smolder zu Funke

Im Jahr 2021 haben wir Smolder als Open Source veröffentlicht – eine Spark-Bibliothek, die HL7v2-Nachrichten in DataFrames lud, damit Teams im Gesundheitswesen Analysen für Echtzeit-EHR-Feeds ausführen konnten, ohne Parser manuell codieren zu müssen. Smolder machte es möglich, HL7-Daten im Lakehouse zu nutzen – zu einer Zeit, als das Parsen von Nachrichten noch eine Hürde für die Einführung darstellte.

Die Plattform hat sich seitdem stark weiterentwickelt. Unity Catalog verwaltet Daten, Volumes und Modelle. Declarative Automation Bundles paketieren und deployen Projekte als Code. Spark Declarative Pipelines übernehmen das Streaming-Ingestion deklarativ. Smolder entstand jedoch vor all dem und wurde nicht dafür entwickelt, sich nahtlos in die moderne Databricks-Plattform einzufügen.

Funke ist der Nachfolger, neu aufgebaut für die heutige Plattform. Der Name ist eine kleine Anspielung auf die Herkunft: Funke steht im Deutschen für Spark. Während Smolder eine Scala-Datenquelle war, ist Funke eine Python- und PySpark-Bibliothek sowie eine einsatzbereite Pipeline. Es parst in native Spark-Typen, wird als DAB deployed, nimmt Daten über eine Declarative Pipeline auf und speichert alles in Unity Catalog. Benutzer können in wenigen Minuten von Grund auf eine skalierbare, streamingfähige HL7-Pipeline aufbauen.

Die Grundidee von Smolder – HL7 als erstklassige Lakehouse-Daten zu behandeln – bleibt dieselbe. Die Implementierung ist neu.

Was Funke unterscheidet

Funke parst eine HL7v2-Nachricht direkt in einen nativen Spark-Typ und behält die gesamte Hierarchie bei. Das Parsen ist verlustfrei konzipiert, mit dem Ziel, die gesamte ursprüngliche Struktur so weit wie möglich in der Pipeline zu erhalten.

Eine geparste Nachricht wird als Map vom Segmentnamen zu den Wiederholungen dieses Segments modelliert. Jedes Feld ist selbst eine Map, adressierbar nach Feldnummer, dann Wiederholung, dann Komponente, dann Subkomponente. In Spark-Begriffen ausgedrückt:

Da die geparste Nachricht eine normale Spark-Spalte ist, lässt sich jedes Element mit gewöhnlichen DataFrame- oder SQL-Ausdrücken erreichen, und der Parser übernimmt die HL7-Codierungsregeln für Sie: die im MSH-Header deklarierten Trennzeichen für Felder, Komponenten, Wiederholungen und Subkomponenten sowie die Standard-Escape-Sequenzen. Funke unterstützt jeden HL7-Nachrichtentyp und jede Version, sodass dieselbe Pipeline Nachrichten über das gesamte Spektrum hinweg verarbeiten kann, das ein Gesundheitssystem typischerweise empfängt.

Dadurch landen Ihre klinischen Rohdaten vollständig und detailgetreu im Lakehouse, verwaltet durch Unity Catalog und bereit für Abfragen. Sie entscheiden selbst, welche Felder für einen bestimmten Anwendungsfall wichtig sind, anstatt die Form zu akzeptieren, die ein Konverter oder Anbieter für Sie ausgewählt hat.

So funktioniert es: die Ingestion-Pipeline

Funke wird als Declarative Pipeline bereitgestellt, die dem Medaillon-Muster folgt. Es definiert zwei Tabellen, auf deren Grundlage Sie Gold-Tabellen für Ihre eigenen Anwendungsfälle erstellen.

Abbildung 1: Funke-Datenfluss im Databricks Lakehouse

image1.png

Landing zu Bronze. Neue HL7-Dateien kommen in einem Unity Catalog Volume an. Auto Loader erfasst sie, decodiert den Inhalt und schreibt sie zusammen mit Ingestion-Metadaten – einschließlich eines MD5-Hashes zur Nachverfolgung einer Nachricht in der Pipeline, eines Einfüge-Zeitstempels und einer Nachrichten-ID – in die Tabelle raw_messages.

Bronze zu Silber. Die Tabelle parsed_messages liest den Rohdaten-Stream und wendet den Parser von Funke an, wobei eine einzelne Spalte hl7 des oben gezeigten nativen Typs hinzugefügt wird. Hier wird unstrukturierter Nachrichtentext zu strukturierten, abfragbaren Daten.

Von der Rohnachricht zur Gold-Tabelle

Da die Spalte hl7 native Spark-Daten enthält, können Sie jedes Element direkt über Segment, Feld, Wiederholung, Komponente und Subkomponente adressieren:

Dieselbe Extraktion funktioniert auch in Spark SQL, sodass Analysten, die nie mit Python arbeiten, Gold-Tabellen und Views direkt erstellen können:

Positionsindexketten sind präzise, aber Monate nach der Entwicklung oft schwer nachzuvollziehen. Aus diesem Grund bietet Funke Accessor-Hilfsfunktionen, die Entwicklern helfen, Inhalte sauber zu extrahieren. get_value nimmt das Segment, seine Wiederholung, das Feld, die Feldwiederholung, die Komponente und die Subkomponente entgegen und gibt den Wert als Spalte zurück:

Es gibt auch höherwertige Hilfsfunktionen, darunter get_segment, get_field, get_component, get_subcomponent und eine Hilfsfunktion parse_hl7_version, die die Version direkt aus dem MSH-Header liest. Sie wählen das Abstraktionsniveau, das zur Abfrage passt.

Ende-zu-Ende in Aktion erleben

Funke enthält eine Demo, sodass Sie den gesamten Ablauf verfolgen können, ohne einen Live-EHR-Feed anbinden zu müssen. Sie umfasst einen Generator für synthetische ADT-Ereignisse, der Aufnahmen, Verlegungen und Entlassungen über mehrere Einrichtungen hinweg simuliert, sowie eine Steuerungs-App (basierend auf Databricks Apps), die den Ereignis-Stream startet und stoppt und eine Nachricht vom Rohtext über die geparste Struktur bis zur Gold-Tabelle nachverfolgt.

image2.gif

Die Gold-Schicht der Demo ist ein eigenständiges funktionierendes Beispiel. Sie verwandelt den geparsten ADT-Stream in eine adt_events-Historientabelle und verwaltet dann mithilfe von Change Data Capture (basierend auf der Besuchsnummer) eine Live-current_census-Tabelle, sodass ein Entlassungsereignis einen Patienten aus der Belegungsliste entfernt und das Bett freigibt. Eine bed_utilization-Tabelle verknüpft diese Live-Belegungsliste mit der Kapazität der Einrichtung, um belegte im Vergleich zu verfügbaren Betten pro Abteilung anzuzeigen und ein Dashboard zu speisen. Es ist ein konkretes Beispiel dafür, wie aus rohen HL7-Nachrichten eine operative Kennzahl wird, die ein Krankenhaus tatsächlich überwachen würde.

Erste Schritte

Funke ist ein Databricks Industry Solutions Accelerator, der als Asset Bundle bereitgestellt wird:

  1. Klonen Sie das Repository in Ihren Databricks-Workspace.
  2. Öffnen Sie das Verzeichnis im DAB-Editor und klicken Sie auf Deploy. Die Bereitstellung baut die funke-Bibliothek auf und richtet die Pipeline, das Unity Catalog-Schema sowie das Landing-Volume für Sie ein.
  3. Laden Sie HL7-Nachrichten in das erstellte landing-Volume hoch.
  4. Klicken Sie bei der HL7-Ingestion-Pipeline auf Run.

Wenn Sie die Befehlszeile bevorzugen, wird dieselbe Bereitstellung mit der Databricks CLI ausgeführt:

Was Funke ist und was nicht

Funke ist ein Parser und ein Ingestion-Accelerator. Es stellt Ihnen HL7v2-Nachrichten als native, governed und abfragbare Lakehouse-Daten zur Verfügung sowie ein sauberes Muster, um diese in die Gold-Tabellen umzuwandeln, die Ihre Anwendungsfälle benötigen. Es ist keine Interface Engine und ersetzt nicht das klinische und HL7-Fachwissen, das für eine korrekte Interpretation dieser Nachrichten erforderlich ist. Die Zuordnung eines Segments und Feldes zu einem Fachkonzept ist eine Entscheidung, die Sie mit Ihrem eigenen Domänenwissen treffen. Funkes Aufgabe ist es sicherzustellen, dass die Daten genau dort, vollständig und leicht erreichbar sind, wenn Sie diese Entscheidung treffen.

Probieren Sie es aus

Funke ist Open Source unter der Databricks-Lizenz. Erkunden Sie den Code, führen Sie die Demo aus und öffnen Sie ein Issue mit Feedback oder Ideen:

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

Die in der Demo verwendeten Testnachrichten stammen aus dem HL7-v2-to-FHIR-Projekt.

(Dieser Blogbeitrag wurde mit KI-gestützten Tools übersetzt.) Originalbeitrag

Erhalten Sie die neuesten Beiträge in Ihrem Posteingang

Abonnieren Sie unseren Blog und erhalten Sie die neuesten Beiträge direkt in Ihren Posteingang.