Ir al contenido principal
Salud y ciencias biológicas

Presentamos Funke: parsing nativo de HL7v2 en Databricks

Un acelerador de código abierto que convierte mensajes HL7v2 sin procesar en datos consultables y nativos de Spark, sin conversión a FHIR ni aplanamiento de terceros.

por Sean Fischer, Chris Mantz y Andy Launchbury

  • Funke procesa mensajes de registros médicos electrónicos HL7v2 directamente en tipos nativos de Spark en Databricks Lakehouse, preservando toda la jerarquía de segmentos, campos, componentes y subcomponentes del mensaje original.
  • Es el sucesor de Smolder, nuestra biblioteca de Scala de 2021, reconstruida en Python y PySpark en torno a Unity Catalog, Declarative Automation Bundles y Spark Declarative Pipelines.
  • Funke es de código abierto e incluye una demostración ejecutable, por lo que puede poner en marcha una canalización de ingesta de HL7 de extremo a extremo y explorar datos clínicos analizados en cuestión de minutos.

El problema de HL7v2 en el lakehouse

HL7v2 es el estándar de mensajería que impulsa discretamente el sector de la salud. Es la forma en que los sistemas clínicos se comunican entre sí que se admitió a un paciente, que se realizó una orden de laboratorio o que se devolvió un resultado. Decenas de años después de su introducción, sigue siendo el estándar de integración más utilizado en la industria, y la gran mayoría de las organizaciones de atención médica aún dependen de él para el flujo rutinario de datos operativos.

También es difícil trabajar con él. Un mensaje HL7v2 es una estructura anidada codificada por delimitadores: segmentos formados por campos, campos formados por componentes y repeticiones, y componentes formados por subcomponentes, todos separados por un pequeño conjunto de caracteres especiales que el propio mensaje declara en su encabezado. La especificación permite cierta flexibilidad, por lo que los mensajes del mundo real varían de un sistema emisor a otro.

Cuando los equipos quieren esos datos en un formato moderno, suelen recurrir a una de dos soluciones alternativas. Primero convierten todo a FHIR, lo que añade una capa de traducción y puede descartar detalles que nunca tuvieron un equivalente claro en FHIR. O bien entregan los mensajes a un motor de terceros que aplana la jerarquía en tablas anchas, lo que significa pagar a otro proveedor, mover datos fuera de la plataforma y perder el acceso directo a la estructura granular subyacente. Ambas vías aumentan los costos, añaden latencia y crean distancia entre usted y sus propios datos clínicos.

De Smolder a Funke

En 2021 lanzamos como código abierto Smolder, una biblioteca de Spark que cargaba mensajes HL7v2 en DataFrames para que los equipos de salud pudieran realizar análisis sobre transmisiones de EHR en tiempo real sin tener que codificar analizadores a mano. Smolder hizo posible utilizar datos HL7 en el lakehouse en un momento en que el análisis de mensajes era una barrera importante para la adopción.

La plataforma ha evolucionado mucho desde entonces. Unity Catalog gobierna datos, volúmenes y modelos. Declarative Automation Bundles empaqueta y despliega proyectos como código. Spark Declarative Pipelines maneja la ingesta en streaming de forma declarativa. Pero Smolder es anterior a todo esto y no se creó para integrarse perfectamente con la plataforma moderna de Databricks.

Funke es el sucesor, rediseñado para la plataforma tal como es hoy. El nombre es un pequeño guiño a su linaje: Funke significa spark en alemán. Mientras que Smolder era una fuente de datos de Scala, Funke es una biblioteca de Python y PySpark, además de una canalización lista para desplegar. Analiza tipos nativos de Spark, se despliega como un DAB, ingiere a través de una Declarative Pipeline y almacena todo en Unity Catalog. Los usuarios pueden pasar de cero a una canalización de HL7 escalable y en streaming en cuestión de minutos.

La idea con la que comenzó Smolder (HL7 como datos de primera clase en el lakehouse) sigue siendo la misma. La implementación es nueva.

Qué hace diferente a Funke

Funke analiza un mensaje HL7v2 directamente en un tipo nativo de Spark y mantiene intacta toda la jerarquía. El análisis está diseñado para no perder información, con el objetivo de conservar toda la estructura original durante la mayor parte posible del recorrido por la canalización.

Un mensaje analizado se modela como un mapa desde el nombre del segmento hasta las repeticiones de ese segmento. Cada campo es en sí mismo un mapa, al que se puede acceder por número de campo, luego repetición, luego componente y luego subcomponente. En términos de Spark:

Como el mensaje analizado es una columna común de Spark, se puede acceder a cada elemento con expresiones habituales de DataFrame o SQL, y el analizador maneja las reglas de codificación de HL7 por usted: los separadores de campos, componentes, repeticiones y subcomponentes declarados en el encabezado MSH, además de las secuencias de escape estándar. Funke admite todos los tipos y versiones de mensajes HL7, por lo que la misma canalización puede aceptar mensajes en toda la gama de versiones que un sistema de salud suele recibir.

Como resultado, sus datos clínicos sin procesar llegan al lakehouse con total fidelidad, gobernados por Unity Catalog y listos para consultar. Usted decide qué campos son importantes para un caso de uso determinado, en lugar de aceptar la forma que un convertidor o proveedor eligió por usted.

Cómo funciona: la canalización de ingesta

Funke se despliega como una Declarative Pipeline que sigue el patrón medallion. Define dos tablas y usted crea tablas gold sobre ellas para sus propios casos de uso.

Figura 1: Flujo de datos de Funke en el Databricks Lakehouse

image1.png

De landing a bronze. Los nuevos archivos HL7 llegan a un volumen de Unity Catalog. Auto Loader los recoge, decodifica el contenido y los escribe en la tabla raw_messages junto con los metadatos de ingesta, incluidos un hash MD5 para rastrear un mensaje a través de la canalización, una marca de tiempo de inserción y un ID de mensaje.

De bronze a silver. La tabla parsed_messages lee la transmisión sin procesar y aplica el analizador de Funke, agregando una sola columna hl7 del tipo nativo mostrado arriba. Aquí es donde el texto del mensaje no estructurado se convierte en datos estructurados y consultables.

De un mensaje sin procesar a una tabla gold

Como la columna hl7 son datos nativos de Spark, puede dirigirse a cualquier elemento directamente por segmento, campo, repetición, componente y subcomponente:

La misma extracción funciona en Spark SQL, de modo que los analistas que nunca utilizan Python pueden crear tablas y vistas gold directamente:

Las cadenas de índices posicionales son precisas, pero son difíciles de interpretar meses después del desarrollo. Por esa razón, Funke incluye asistentes de acceso (accessor helpers) que ayudan a los desarrolladores a extraer contenido de forma limpia. get_value toma el segmento, su repetición, el campo, la repetición del campo, el componente y el subcomponente, y devuelve el valor como una columna:

También hay asistentes de mayor nivel, incluidos get_segment, get_field, get_component, get_subcomponent y un asistente parse_hl7_version que lee la versión directamente del encabezado MSH. Usted elige el nivel de abstracción que mejor se adapte a la consulta.

Vea cómo se ejecuta de extremo a extremo

Funke incluye una demostración para que pueda ver todo el flujo sin necesidad de conectar una transmisión de EHR en vivo. Incluye un generador sintético de eventos ADT que simula admisiones, transferencias y altas en un conjunto de instalaciones, y una aplicación de sala de control, integrada en Databricks Apps, que inicia y detiene la transmisión de eventos y rastrea un mensaje desde el texto sin procesar a través de la estructura analizada hasta la capa gold.

image2.gif

La capa gold de la demo es un ejemplo funcional por sí misma. Convierte la secuencia ADT analizada en una tabla de historial adt_events y, a continuación, mantiene una tabla current_census en vivo mediante la captura de datos modificados (CDC) utilizando como clave el número de visita, de modo que un evento de alta elimina a un paciente del censo y libera la cama. Una tabla bed_utilization combina ese censo en vivo con la capacidad de la instalación para mostrar las camas ocupadas frente a las disponibles por unidad, alimentando un panel de control. Es una ilustración concreta de cómo pasar de mensajes HL7 sin procesar a una métrica operativa que un hospital realmente supervisaría.

Primeros pasos

Funke es un acelerador de Databricks Industry Solutions, implementado como un Asset Bundle:

  1. Clona el repositorio en tu espacio de trabajo de Databricks.
  2. Abre el directorio en el editor DAB y haz clic en Deploy. La implementación crea la biblioteca funke y aprovisiona la canalización, el esquema de Unity Catalog y el volumen de aterrizaje por ti.
  3. Carga mensajes HL7 en el volumen landing creado.
  4. Haz clic en Run en la canalización de ingesta HL7.

Si prefieres la línea de comandos, la misma implementación se ejecuta con la Databricks CLI:

Qué es Funke y qué no es

Funke es un analizador y un acelerador de ingesta. Te ofrece mensajes HL7v2 como datos de lakehouse nativos, gobernados y consultables, y un patrón limpio para convertirlos en las tablas gold que necesitan tus casos de uso. No es un motor de interfaz y no reemplaza la experiencia clínica y de HL7 requerida para interpretar esos mensajes de forma correcta. La asignación de un segmento y un campo a un concepto de negocio es una decisión que tomas con tu propio conocimiento del dominio. El trabajo de Funke es asegurarse de que, cuando tomes esa decisión, los datos estén justo ahí, completos y de fácil acceso.

Pruébalo

Funke es de código abierto bajo la Licencia de Databricks. Explora el código, ejecuta la demo y abre una incidencia con comentarios o ideas:

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

Los mensajes de prueba utilizados en la demo provienen del proyecto HL7 v2-to-FHIR.

(Esta entrada del blog ha sido traducida utilizando herramientas basadas en inteligencia artificial) Publicación original

Recibe las últimas publicaciones en tu bandeja de entrada

Suscríbete a nuestro blog y recibe las últimas publicaciones directamente en tu bandeja de entrada.