Revenir au contenu principal

Présentation de Funke : analyse native HL7v2 sur Databricks

Un accélérateur open source qui transforme les messages HL7v2 bruts en données interrogeables et natives Spark, sans conversion FHIR ni aplatissement tiers.

par Sean Fischer, Chris Mantz et Andy Launchbury

  • Funke analyse directement les messages de dossiers médicaux électroniques HL7v2 dans des types Spark natifs sur le Databricks Lakehouse, en préservant toute la hiérarchie des segments, champs, composants et sous-composants du message d'origine.
  • Il succède à Smolder, notre bibliothèque Scala de 2021, réécrite en Python et PySpark autour d'Unity Catalog, de Declarative Automation Bundles et de Spark Declarative Pipelines.
  • Funke est open source et livré avec une démo exécutable, vous permettant de mettre en place un pipeline d'ingestion HL7 de bout en bout et d'explorer les données cliniques analysées en quelques minutes.

Le problème HL7v2 dans le lakehouse

HL7v2 est la norme de messagerie qui alimente discrètement le secteur de la santé. C'est ainsi que les systèmes cliniques s'informent mutuellement de l'admission d'un patient, de la création d'une commande d'analyse ou de la réception d'un résultat. Des décennies après son introduction, elle reste la norme d'intégration la plus déployée dans le secteur, et la grande majorité des établissements de santé en dépendent encore pour le flux quotidien de leurs données opérationnelles.

Elle est également difficile à exploiter. Un message HL7v2 est une structure imbriquée codée par des délimiteurs : des segments composés de champs, des champs composés de composants et de répétitions, des composants composés de sous-composants, tous séparés par un petit ensemble de caractères spéciaux que le message déclare lui-même dans son en-tête. La spécification laisse une certaine flexibilité, de sorte que les messages du monde réel varient d'un système émetteur à l'autre.

Lorsque les équipes souhaitent obtenir ces données dans un format moderne, elles ont généralement recours à l'une de ces deux solutions de contournement. Elles convertissent d'abord tout en FHIR, ce qui ajoute une couche de traduction et peut faire perdre des détails qui n'ont jamais eu d'équivalent FHIR clair. Ou bien elles transmettent les messages à un moteur tiers qui aplatit la hiérarchie dans de larges tables, ce qui implique de payer un autre fournisseur, d'extraire les données de la plateforme et de perdre l'accès direct à la structure granulaire sous-jacente. Ces deux approches augmentent les coûts, ajoutent de la latence et vous éloignent de vos propres données cliniques.

De Smolder à Funke

En 2021, nous avons rendu open source Smolder, une bibliothèque Spark qui chargeait les messages HL7v2 dans des DataFrames afin que les équipes de santé puissent exécuter des analyses sur des flux EHR en temps réel sans avoir à coder manuellement des analyseurs. Smolder a permis d'utiliser les données HL7 dans le lakehouse à une époque où l'analyse syntaxique des messages constituait un obstacle majeur à l'adoption.

La plateforme a beaucoup évolué depuis. Unity Catalog gouverne les données, les volumes et les modèles. Les Declarative Automation Bundles empaquètent et déploient les projets sous forme de code. Les Spark Declarative Pipelines gèrent l'ingestion en streaming de façon déclarative. Mais Smolder est antérieur à tout cela et n'a pas été conçu pour s'intégrer de manière transparente avec la plateforme Databricks moderne.

Funke est son successeur, repensé pour la plateforme telle qu'elle est aujourd'hui. Son nom est un petit clin d'œil à sa lignée : Funke signifie étincelle (spark) en allemand. Là où Smolder était une source de données Scala, Funke est une bibliothèque Python et PySpark assortie d'un pipeline prêt à être déployé. Il analyse les messages dans des types Spark natifs, se déploie sous forme de DAB, gère l'ingestion via un Declarative Pipeline et stocke le tout dans Unity Catalog. Les utilisateurs peuvent passer de zéro à un pipeline HL7 scalable et en streaming en quelques minutes.

L'idée initiale de Smolder, faire de HL7 une donnée de premier ordre dans le lakehouse, reste la même. C'est l'implémentation qui est nouvelle.

Ce qui différencie Funke

Funke analyse un message HL7v2 directement dans un type Spark natif et conserve toute la hiérarchie intacte. L'analyse syntaxique est conçue pour être sans perte, avec pour objectif de préserver l'ensemble de la structure d'origine aussi loin que possible dans le pipeline.

Un message analysé est modélisé sous la forme d'une mappe associant le nom du segment aux répétitions de ce segment. Chaque champ est lui-même une mappe, accessible par le numéro de champ, puis la répétition, le composant et le sous-composant. En termes Spark :

Étant donné que le message analysé est une colonne Spark normale, chaque élément est accessible avec des expressions DataFrame ou SQL ordinaires, et l'analyseur gère les règles d'encodage HL7 pour vous : les séparateurs de champ, de composant, de répétition et de sous-composant déclarés dans l'en-tête MSH, ainsi que les séquences d'échappement standard. Funke prend en charge tous les types et versions de messages HL7, ce qui permet au même pipeline d'accepter des messages couvrant l'ensemble des versions qu'un système de santé reçoit habituellement.

En conséquence, vos données cliniques brutes arrivent dans le lakehouse avec une fidélité totale, gouvernées par Unity Catalog et prêtes à être interrogées. C'est vous qui décidez quels champs comptent pour un cas d'usage donné, au lieu d'accepter le format choisi par un convertisseur ou un fournisseur.

Comment ça marche : le pipeline d'ingestion

Funke se déploie sous la forme d'un Declarative Pipeline respectant l'architecture médaillon. Il définit deux tables, à partir desquelles vous pouvez créer des tables Gold selon vos propres cas d'usage.

Figure 1 : Flux de données Funke sur le lakehouse Databricks

image1.png

De la zone d'arrivée à Bronze. Les nouveaux fichiers HL7 arrivent dans un volume Unity Catalog. Auto Loader les récupère, décode le contenu et les écrit dans la table raw_messages aux côtés de métadonnées d'ingestion comprenant un hachage MD5 pour suivre le message tout au long du pipeline, un horodatage d'insertion et un ID de message.

De Bronze à Silver. La table parsed_messages lit le flux brut et applique l'analyseur de Funke, en ajoutant une seule colonne hl7 du type natif indiqué ci-dessus. C'est ici que le texte de message non structuré devient une donnée structurée et interrogeable.

D'un message brut à une table Gold

Comme la colonne hl7 contient des données Spark natives, vous pouvez cibler directement n'importe quel élément par segment, champ, répétition, composant et sous-composant :

La même extraction fonctionne en Spark SQL, de sorte que les analystes qui n'utilisent jamais Python peuvent créer directement des tables et des vues Gold :

Les chaînes d'index positionnels sont précises, mais elles sont difficiles à interpréter des mois après le développement. C'est pourquoi Funke propose des assistants d'accès qui aident les développeurs à extraire proprement le contenu. get_value prend le segment, sa répétition, le champ, la répétition de champ, le composant et le sous-composant, puis renvoie la valeur sous forme de colonne :

Il existe également des assistants de plus haut niveau, notamment get_segment, get_field, get_component, get_subcomponent, ainsi qu'un assistant parse_hl7_version qui lit la version directement dans l'en-tête MSH. Vous choisissez le niveau d'abstraction qui convient à la requête.

Découvrez son fonctionnement de bout en bout

Funke comprend une démonstration vous permettant de visualiser l'ensemble du flux sans avoir à vous connecter à un flux EHR en direct. Elle inclut un générateur d'événements ADT synthétiques qui simule les admissions, les transferts et les sorties dans un ensemble d'établissements, ainsi qu'une application de salle de contrôle, conçue sur Databricks Apps, qui démarre et arrête le flux d'événements et suit un message depuis le texte brut jusqu'à la table Gold en passant par la structure analysée.

image2.gif

La couche Gold de la démonstration est un exemple concret en soi. Elle transforme le flux ADT analysé en une table d'historique adt_events, puis maintient une table current_census en direct à l'aide de la capture de données modifiées (Change Data Capture) basée sur le numéro de visite, de sorte qu'un événement de sortie retire un patient du recensement et libère le lit. Une table bed_utilization joint ce recensement en direct à la capacité de l'établissement pour afficher les lits occupés par rapport aux lits disponibles par unité, ce qui alimente un tableau de bord. C'est une illustration concrète du passage de messages HL7 bruts à une métrique opérationnelle qu'un hôpital surveillerait réellement.

Prise en main

Funke est un accélérateur de Databricks Industry Solutions, déployé sous forme d'Asset Bundle :

  1. Clonez le dépôt dans votre espace de travail Databricks.
  2. Ouvrez le répertoire dans l'éditeur DAB et cliquez sur Deploy. Le déploiement crée la bibliothèque funke et provisionne pour vous le pipeline, le schéma Unity Catalog et le volume d'atterrissage.
  3. Chargez les messages HL7 dans le volume landing créé.
  4. Cliquez sur Run dans le pipeline d'ingestion HL7.

Si vous préférez la ligne de commande, le même déploiement s'exécute avec la CLI Databricks :

Ce qu'est Funke, et ce qu'il n'est pas

Funke est un analyseur syntaxique et un accélérateur d'ingestion. Il vous fournit des messages HL7v2 sous forme de données lakehouse natives, gouvernées et interrogables, ainsi qu'un modèle propre pour les transformer en tables Gold dont vos cas d'usage ont besoin. Ce n'est pas un moteur d'interface, et il ne remplace pas l'expertise clinique et HL7 requise pour interpréter correctement ces messages. Le mappage d'un segment et d'un champ vers un concept métier est une décision que vous prenez grâce à vos propres connaissances du domaine. Le rôle de Funke est de s'assurer que lorsque vous prenez cette décision, les données sont à portée de main, complètes et faciles d'accès.

Essayez-le

Funke est open source sous la licence Databricks. Explorez le code, exécutez la démonstration et ouvrez un ticket (issue) pour nous faire part de vos commentaires ou de vos idées :

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

Les messages de test utilisés dans la démonstration proviennent du projet HL7 v2-to-FHIR.

(Cet article de blog a été traduit à l'aide d'outils basés sur l'intelligence artificielle) Article original

Recevez les derniers articles dans votre boîte mail

Abonnez-vous à notre blog et recevez les derniers articles directement dans votre boîte mail.