Ir para o conteúdo principal
Saúde e ciências da vida

Apresentando o Funke: parsing nativo de HL7v2 no Databricks

Um acelerador open source que transforma mensagens HL7v2 brutas em dados nativos do Spark e consultáveis, sem conversão para FHIR ou nivelamento por terceiros.

por Sean Fischer, Chris Mantz e Andy Launchbury

  • O Funke faz o parsing de mensagens de prontuário eletrônico de saúde no formato HL7v2 diretamente em tipos nativos do Spark no Databricks Lakehouse, preservando toda a hierarquia de segmentos, campos, componentes e subcomponentes da mensagem original.
  • Ele é o sucessor da Smolder, nossa biblioteca em Scala de 2021, recriada em Python e PySpark com base no Unity Catalog, Declarative Automation Bundles e Spark Declarative Pipelines.
  • O Funke é open source e vem com uma demonstração executável, para que você possa criar um pipeline de ingestão de HL7 de ponta a ponta e explorar dados clínicos analisados em minutos.

O problema do HL7v2 no lakehouse

O HL7v2 é o padrão de mensagens que movimenta silenciosamente a área da saúde. É assim que os sistemas clínicos informam uns aos outros que um paciente foi admitido, que um pedido de exame foi feito ou que um resultado retornou. Décadas após sua introdução, ele continua sendo o padrão de integração mais amplamente implantado no setor, e a grande maioria das organizações de saúde ainda depende dele para o fluxo rotineiro de dados operacionais.

Também é difícil de trabalhar. Uma mensagem HL7v2 é uma estrutura aninhada e codificada por delimitadores: segmentos compostos por campos, campos compostos por componentes e repetições, componentes compostos por subcomponentes, todos separados por um pequeno conjunto de caracteres especiais que a própria mensagem declara em seu cabeçalho. A especificação deixa espaço para flexibilidade, portanto, as mensagens do mundo real variam de um sistema remetente para outro.

Quando as equipes querem esses dados em um formato moderno, geralmente recorrem a uma de duas soluções paliativas. Elas convertem tudo para FHIR primeiro, o que adiciona uma camada de tradução e pode descartar detalhes que nunca tiveram um equivalente claro no FHIR. Ou entregam as mensagens a um mecanismo de terceiros que nivela a hierarquia em tabelas amplas, o que significa pagar a outro fornecedor, mover dados para fora da plataforma e perder o acesso direto à estrutura granular subjacente. Ambos os caminhos adicionam custo, aumentam a latência e distanciam você dos seus próprios dados clínicos.

Do Smolder ao Funke

Em 2021, disponibilizamos em código aberto o Smolder, uma biblioteca Spark que carregava mensagens HL7v2 em DataFrames para que as equipes de saúde pudessem executar análises em feeds de EHR em tempo real sem precisar codificar parsers manualmente. O Smolder possibilitou o uso de dados HL7 no lakehouse em um momento em que a análise sintática de mensagens era uma grande barreira para a adoção.

A plataforma evoluiu muito desde então. O Unity Catalog governa dados, volumes e modelos. Os Declarative Automation Bundles empacotam e implantam projetos como código. Os Spark Declarative Pipelines tratam a ingestão em tempo real (streaming) de forma declarativa. Mas o Smolder é anterior a tudo isso e não foi criado para se integrar perfeitamente à plataforma moderna da Databricks.

O Funke é o sucessor, reconstruído para a plataforma como ela é hoje. O nome é uma pequena homenagem à sua linhagem: Funke é alemão para spark. Enquanto o Smolder era uma fonte de dados Scala, o Funke é uma biblioteca em Python e PySpark com um pipeline pronto para implantação. Ele faz a análise sintática para tipos nativos do Spark, é implantado como um DAB, ingere por meio de um Declarative Pipeline e armazena tudo no Unity Catalog. Os usuários podem sair do zero para um pipeline de HL7 escalável e em streaming em minutos.

A ideia iniciada pelo Smolder — HL7 como dados de primeira classe no lakehouse — permanece a mesma. A implementação é nova.

O que torna o Funke diferente

O Funke analisa uma mensagem HL7v2 diretamente em um tipo nativo do Spark e mantém toda a hierarquia intacta. A análise foi projetada para ser sem perdas, com o objetivo de reter toda a estrutura original o máximo possível ao longo do pipeline.

Uma mensagem analisada é modelada como um mapeamento do nome do segmento para as repetições desse segmento. Cada campo em si é um mapeamento, acessível por número de campo, depois repetição, depois componente e depois subcomponente. Em termos do Spark:

Como a mensagem analisada é uma coluna normal do Spark, todos os elementos podem ser acessados com expressões comuns do DataFrame ou SQL, e o parser lida com as regras de codificação de HL7 para você: os separadores de campo, componente, repetição e subcomponente declarados no cabeçalho MSH, além das sequências de escape padrão. O Funke dá suporte a todos os tipos e versões de mensagens HL7, para que o mesmo pipeline possa aceitar mensagens em toda a gama de versões que um sistema de saúde normalmente recebe.

Como resultado, seus dados clínicos brutos chegam ao lakehouse com total fidelidade, governados pelo Unity Catalog e prontos para consulta. Você decide quais campos são importantes para um determinado caso de uso, em vez de aceitar o formato escolhido por um conversor ou fornecedor.

Como funciona: o pipeline de ingestão

O Funke é implantado como um Declarative Pipeline que segue o padrão medalhão. Ele define duas tabelas, e você constrói tabelas gold no topo para seus próprios casos de uso.

Figura 1: Fluxo de dados do Funke no Databricks Lakehouse

image1.png

Da landing para a bronze. Novos arquivos HL7 chegam a um volume do Unity Catalog. O Auto Loader os identifica, decodifica o conteúdo e os grava na tabela raw_messages junto com os metadados de ingestão, incluindo um hash MD5 para rastrear a mensagem no pipeline, um carimbo de data/hora (timestamp) de inserção e um ID de mensagem.

Da bronze para a silver. A tabela parsed_messages lê o fluxo bruto e aplica o parser do Funke, adicionando uma única coluna hl7 do tipo nativo mostrado acima. É aqui que o texto não estruturado da mensagem se torna dados estruturados e consultáveis.

De uma mensagem bruta a uma tabela gold

Como a coluna hl7 são dados nativos do Spark, você pode endereçar qualquer elemento diretamente por segmento, campo, repetição, componente e subcomponente:

A mesma extração funciona no Spark SQL, portanto, os analistas que nunca usam Python podem criar tabelas gold e exibições diretamente:

Cadeias de índices posicionais são precisas, mas são difíceis de interpretar meses após o desenvolvimento. Por esse motivo, o Funke inclui auxiliares de acesso que ajudam os desenvolvedores a extrair conteúdo de forma limpa. O get_value recebe o segmento, sua repetição, o campo, a repetição do campo, o componente e o subcomponente, e retorna o valor como uma coluna:

Há também auxiliares de nível mais alto, incluindo get_segment, get_field, get_component, get_subcomponent e um auxiliar parse_hl7_version que lê a versão diretamente do cabeçalho MSH. Você escolhe o nível de abstração adequado para a consulta.

Veja-o em execução de ponta a ponta

O Funke vem com uma demonstração para que você possa acompanhar todo o fluxo sem precisar se conectar a um feed de EHR em tempo real. Ele inclui um gerador sintético de eventos ADT que simula admissões, transferências e altas em um conjunto de instalações, além de um aplicativo de sala de controle, criado com o Databricks Apps, que inicia e interrompe o fluxo de eventos e rastreia uma mensagem desde o texto bruto até a estrutura analisada e a camada gold.

image2.gif

A camada gold da demonstração é um exemplo prático por si só. Ela transforma o fluxo ADT analisado em uma tabela de histórico adt_events e, em seguida, mantém uma tabela current_census em tempo real usando captura de alterações de dados baseada no número da visita, de modo que um evento de alta remove o paciente do censo e libera o leito. Uma tabela bed_utilization junta esse censo em tempo real com a capacidade da instalação para mostrar leitos ocupados versus disponíveis por unidade, alimentando um painel. É uma ilustração concreta de como ir de mensagens HL7 brutas até uma métrica operacional que um hospital realmente acompanharia.

Primeiros passos

O Funke é um acelerador do Databricks Industry Solutions, implantado como um Asset Bundle:

  1. Clone o repositório no seu workspace do Databricks.
  2. Abra o diretório no editor DAB e clique em Implantar. A implantação cria a biblioteca funke e provisiona o pipeline, o esquema do Unity Catalog e o volume de destino para você.
  3. Faça upload das mensagens HL7 para o volume landing criado.
  4. Clique em Executar no pipeline de ingestão HL7.

Se você preferir a linha de comando, a mesma implantação pode ser executada com a CLI do Databricks:

O que o Funke é e o que ele não é

O Funke é um analisador e um acelerador de ingestão. Ele fornece mensagens HL7v2 como dados nativos, governados e consultáveis do lakehouse, além de um padrão limpo para transformá-los nas tabelas gold de que seus casos de uso precisam. Ele não é um mecanismo de interface e não substitui o conhecimento clínico e em HL7 necessário para interpretar essas mensagens corretamente. O mapeamento de um segmento e campo para um conceito de negócio é uma decisão que você toma com seu próprio conhecimento de domínio. O trabalho do Funke é garantir que, quando você tomar essa decisão, os dados estejam ali, completos e fáceis de acessar.

Experimente

O Funke é um projeto de código aberto sob a Databricks License. Explore o código, execute a demonstração e abra uma issue com comentários ou ideias:

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

As mensagens de teste usadas na demonstração vêm do projeto HL7 v2-to-FHIR.

(Esta publicação no blog foi traduzida utilizando ferramentas baseadas em inteligência artificial) Publicação original

Receba os posts mais recentes na sua caixa de entrada

Assine nosso blog e receba os posts mais recentes diretamente na sua caixa de entrada.