Copiar dados do serviço FHIR para o Azure Synapse Analytics

Neste artigo, você aprenderá três maneiras de copiar dados do serviço FHIR nos Serviços de Dados de Integridade do Azure para o Azure Synapse Analytics, que é um serviço de análise ilimitado que reúne integração de dados, data warehousing corporativo e análise de Big Data.

Usando a ferramenta FHIR to Synapse Sync Agent OSS

Observação

O FHIR para o Agente de Sincronização do Synapse é uma ferramenta de código aberto lançada sob a licença do MIT e não é coberta pelo SLA da Microsoft para serviços do Azure.

O Agente de Sincronização do FHIR para Synapse é um projeto do Microsoft OSS lançado em Licença do MIT. É uma função do Azure que extrai dados de um servidor FHIR usando APIs de Recurso FHIR, converte-os em arquivos Parquet hierárquicos e os grava no Azure Data Lake quase em tempo real. Isso também contém um script para criar tabelas e exibições externas no pool de SQL sem servidor do Synapse apontando para os arquivos Parquet.

Essa solução permite consultar todos os dados FHIR com ferramentas como Synapse Studio, SSMS e Power BI. Você também pode acessar os arquivos Parquet diretamente de um pool do Synapse Spark. Você deve considerar essa solução se quiser acessar todos os seus dados FHIR quase em tempo real e desejar adiar a transformação personalizada para sistemas downstream.

Siga a documentação do OSS para obter instruções de instalação e uso.

Usando a ferramenta soS do gerador de pipeline FHIR para CDM

Observação

O gerador de pipeline FHIR para CDM é uma ferramenta de código aberto lançada sob a licença do MIT e não é coberta pelo SLA da Microsoft para serviços do Azure.

O gerador de pipeline FHIR para CDM é um projeto do Microsoft OSS lançado em Licença do MIT. É uma ferramenta para gerar um pipeline do ADF para copiar um instantâneo de dados de um servidor FHIR usando $export API, transformá-lo em formato csv e gravar em uma pasta CDM no Azure Data Lake Storage Gen 2. A ferramenta requer um arquivo de configuração criado pelo usuário que contém instruções para projetar e nivelar recursos e campos FHIR em tabelas. Você também pode seguir as instruções para criar um pipeline downstream no workspace do Synapse para mover dados da pasta CDM para o pool de SQL dedicado do Synapse.

Essa solução permite transformar os dados em formato tabular conforme eles são gravados na pasta CDM. Você deverá considerar essa solução se quiser transformar dados FHIR em um esquema personalizado depois que eles forem extraídos do servidor FHIR.

Siga a documentação do OSS para obter instruções de instalação e uso.

Carregando dados exportados para o Synapse usando T-SQL

Nessa abordagem, você usa a operação FHIR $export para copiar recursos FHIR em um armazenamento de blobs do AdL Gen 2 (Azure Data Lake Gen 2) em NDJSON formato. Posteriormente, você carrega os dados do armazenamento em pools de SQL dedicados ou sem servidor no Synapse usando T-SQL. Você pode converter essas etapas em um pipeline de movimentação de dados robusto usando pipelines do Synapse.

Armazenamento do Azure no Synapse usando $export.

Usar $export para copiar dados

Configurando $export no servidor FHIR

O servidor FHIR nos Serviços de Dados de Integridade do Azure implementa a $export operação definida pela especificação FHIR para exportar todos ou um subconjunto filtrado de dados FHIR no NDJSON formato. Além disso, ele dá suporte à exportação desidenciada para anonimizar dados FHIR durante a exportação.

Para exportar dados FHIR para o armazenamento de blobs do Azure, primeiro você precisa configurar seu servidor FHIR para exportar dados para a conta de armazenamento. Você precisará (1) habilitar a Identidade Gerenciada, (2) ir para Controle de Acesso na conta de armazenamento e adicionar atribuição de função, (3) selecionar sua conta de armazenamento para $export. Mais passo a passo podem ser encontrados aqui.

Você pode configurar o servidor para exportar os dados para qualquer tipo de conta de armazenamento do Azure, mas recomendamos exportar para o ADL Gen 2 para melhor alinhamento com o Synapse.

Usando o $export comando

Depois de configurar o servidor FHIR, você pode seguir a documentação para exportar seus recursos FHIR no nível sistema, paciente ou grupo. Por exemplo, você pode exportar todos os seus dados FHIR relacionados aos pacientes em um Group com o seguinte $export comando, no qual você especifica o nome de armazenamento de blobs do ADL Gen 2 no campo {{BlobContainer}}:

https://{{FHIR service base URL}}/Group/{{GroupId}}/$export?_container={{BlobContainer}}  

Você também pode usar _type o $export parâmetro na chamada acima para restringir os recursos que deseja exportar. Por exemplo, a chamada a seguir exportará apenas Patientrecursos , MedicationRequeste Observation :

https://{{FHIR service base URL}}/Group/{{GroupId}}/$export?_container={{BlobContainer}}&
_type=Patient,MedicationRequest,Condition

Para obter mais informações sobre os diferentes parâmetros com suporte, confira nossa $export seção de página sobre os parâmetros de consulta.

Usando o Synapse para Análise

Como criar um workspace do Azure Synapse

Antes de usar o Synapse, você precisará de um workspace do Synapse. Você criará um serviço Azure Synapse Analytics no portal do Azure. Mais guia passo a passo pode ser encontrado aqui. Você precisa de uma ADLSGEN2 conta para criar um workspace. Seu workspace Azure Synapse usará essa conta de armazenamento para armazenar os dados do workspace do Synapse.

Depois de criar um workspace, você pode exibir seu workspace no Synapse Studio entrando no workspace no https://web.azuresynapse.netou iniciando Synapse Studio no portal do Azure.

Criando um serviço vinculado entre o armazenamento do Azure e o Synapse

Para copiar seus dados para o Synapse, você precisa criar um serviço vinculado que conecte sua conta de Armazenamento do Azure, onde você exportou seus dados, com o Synapse. Mais instruções passo a passo podem ser encontradas aqui.

  1. Em Synapse Studio, navegue até a guia Gerenciar e, em Conexões externas, selecione Serviços vinculados.
  2. Selecione Novo para adicionar um novo serviço vinculado.
  3. Selecione Azure Data Lake Storage Gen2 na lista e selecione Continuar.
  4. Insira as credenciais de autenticação. Selecione Criar quando terminar.

Agora que você tem um serviço vinculado entre o armazenamento do ADL Gen 2 e o Synapse, você está pronto para usar pools de SQL do Synapse para carregar e analisar seus dados FHIR.

Decidir entre o pool de SQL dedicado e sem servidor

Azure Synapse Analytics oferece dois pools de SQL diferentes, pool de SQL sem servidor e pool de SQL dedicado. O pool de SQL sem servidor oferece a flexibilidade de consultar dados diretamente no armazenamento de blobs usando o ponto de extremidade sql sem servidor sem nenhum provisionamento de recursos. O pool de SQL dedicado tem o poder de processamento para alto desempenho e simultaneidade e é recomendado para recursos de data warehouse de escala empresarial. Para obter mais detalhes sobre os dois pools de SQL, confira a página de documentação do Synapse sobre a arquitetura do SQL.

Usando o pool de SQL sem servidor

Como ele não tem servidor, não há infraestrutura para instalação ou clusters a serem mantidos. Você pode começar a consultar dados de Synapse Studio assim que o workspace for criado.

Por exemplo, a consulta a seguir pode ser usada para transformar campos selecionados de Patient.ndjson em uma estrutura tabular:

SELECT * FROM  
OPENROWSET(bulk 'https://{{youraccount}}.blob.core.windows.net/{{yourcontainer}}/Patient.ndjson', 
FORMAT = 'csv', 
FIELDTERMINATOR ='0x0b', 
FIELDQUOTE = '0x0b')  
WITH (doc NVARCHAR(MAX)) AS rows     
CROSS APPLY OPENJSON(doc)     
WITH ( 
    ResourceId VARCHAR(64) '$.id', 
    Active VARCHAR(10) '$.active', 
    FullName VARCHAR(100) '$.name[0].text', 
    Gender VARCHAR(20) '$.gender', 
       ...
) 

Na consulta acima, a OPENROWSET função acessa arquivos no Armazenamento do Azure e OPENJSON analisa o texto JSON e retorna as propriedades de entrada JSON como linhas e colunas. Sempre que essa consulta é executada, o pool de SQL sem servidor lê o arquivo do armazenamento de blobs, analisa o JSON e extrai os campos.

Você também pode materializar os resultados no formato Parquet em uma Tabela Externa para obter melhor desempenho de consulta, conforme mostrado abaixo:

-- Create External data source where the parquet file will be written 
CREATE EXTERNAL DATA SOURCE [MyDataSource] WITH ( 
    LOCATION = 'https://{{youraccount}}.blob.core.windows.net/{{exttblcontainer}}' 
); 
GO 

-- Create External File Format 
CREATE EXTERNAL FILE FORMAT [ParquetFF] WITH ( 
    FORMAT_TYPE = PARQUET, 
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec' 
); 
GO 

CREATE EXTERNAL TABLE [dbo].[Patient] WITH ( 
        LOCATION = 'PatientParquet/', 
        DATA_SOURCE = [MyDataSource], 
        FILE_FORMAT = [ParquetFF] 
) AS 
SELECT * FROM  
OPENROWSET(bulk 'https://{{youraccount}}.blob.core.windows.net/{{yourcontainer}}/Patient.ndjson' 
-- Use rest of the SQL statement from the previous example --

Usando o pool de SQL dedicado

O pool de SQL dedicado dá suporte a tabelas gerenciadas e a um cache hierárquico para desempenho na memória. Você pode importar Big Data com consultas T-SQL simples e, em seguida, usar a potência do mecanismo de consulta distribuída para executar análises de alto desempenho.

A maneira mais simples e rápida de carregar dados do armazenamento para um pool de SQL dedicado é usar o COPY comando no T-SQL, que pode ler arquivos CSV, Parquet e ORC. Como na consulta de exemplo abaixo, use o COPY comando para carregar as NDJSON linhas em uma estrutura tabular.

-- Create table with HEAP, which is not indexed and does not have a column width limitation of NVARCHAR(4000) 
CREATE TABLE StagingPatient ( 
Resource NVARCHAR(MAX) 
) WITH (HEAP) 
COPY INTO StagingPatient 
FROM 'https://{{yourblobaccount}}.blob.core.windows.net/{{yourcontainer}}/Patient.ndjson' 
WITH ( 
FILE_TYPE = 'CSV', 
ROWTERMINATOR='0x0a', 
FIELDQUOTE = '', 
FIELDTERMINATOR = '0x00' 
) 
GO

Depois de ter as linhas JSON na StagingPatient tabela acima, você poderá criar formatos tabulares diferentes dos dados usando a OPENJSON função e armazenando os resultados em tabelas. Aqui está uma consulta SQL de exemplo para criar uma Patient tabela extraindo alguns campos do Patient recurso:

SELECT RES.* 
INTO Patient 
FROM StagingPatient
CROSS APPLY OPENJSON(Resource)   
WITH (
  ResourceId VARCHAR(64) '$.id',
  FullName VARCHAR(100) '$.name[0].text',
  FamilyName VARCHAR(50) '$.name[0].family',
  GivenName VARCHAR(50) '$.name[0].given[0]',
  Gender VARCHAR(20) '$.gender',
  DOB DATETIME2 '$.birthDate',
  MaritalStatus VARCHAR(20) '$.maritalStatus.coding[0].display',
  LanguageOfCommunication VARCHAR(20) '$.communication[0].language.text'
) AS RES 
GO

Próximas etapas

Neste artigo, você aprendeu três maneiras diferentes de copiar seus dados FHIR para o Synapse.

Em seguida, você pode aprender como des identificá-los enquanto os exporta para o Synapse para proteger o PHI.

FHIR® é uma marca registrada da HL7 e é usado com a permissão da HL7.