Kopiera data från Azure API för FHIR till Azure Synapse Analytics

I den här artikeln får du lära dig tre sätt att kopiera data från Azure API för FHIR till Azure Synapse Analytics, som är en obegränsad analystjänst som sammanför dataintegrering, företagsdatalager och stordataanalys.

Använda OSS-verktyget FHIR till Synapse Sync Agent

Anteckning

FHIR till Synapse Sync Agent är ett öppen källkod verktyg som släppts under MIT-licensen och omfattas inte av Microsoft SLA för Azure-tjänster.

FHIR till Synapse Sync Agent är ett Microsoft OSS-projekt som släppts under MIT-licens. Det är en Azure-funktion som extraherar data från en FHIR-server med hjälp av FHIR-resurs-API:er, konverterar dem till hierarkiska Parquet-filer och skriver dem till Azure Data Lake nästan i realtid. Detta innehåller också ett skript för att skapa externa tabeller och vyer i Synapse Serverless SQL-pool som pekar på Parquet-filerna.

Med den här lösningen kan du köra frågor mot hela FHIR-data med verktyg som Synapse Studio, SSMS och Power BI. Du kan också komma åt Parquet-filerna direkt från en Synapse Spark-pool. Du bör överväga den här lösningen om du vill komma åt alla dina FHIR-data i nära realtid och vill skjuta upp anpassad omvandling till underordnade system.

Följ OSS-dokumentationen för installations- och användningsinstruktioner.

Använda OSS-verktyget FHIR till CDM-pipelinegenerator

Anteckning

FHIR till CDM-pipelinegeneratorn är ett öppen källkod verktyg som släppts under MIT-licensen och omfattas inte av Microsoft SLA för Azure-tjänster.

Pipelinegeneratorn FHIR till CDM är ett Microsoft OSS-projekt som släpptes under MIT-licens. Det är ett verktyg för att generera en ADF-pipeline för att kopiera en ögonblicksbild av data från en FHIR-server med hjälp av $export API, transformera den till csv-format och skriva till en CDM-mapp i Azure Data Lake Storage Gen 2. Verktyget kräver en användarskapad konfigurationsfil som innehåller instruktioner för att projicera och platta ut FHIR-resurser och fält i tabeller. Du kan också följa anvisningarna för att skapa en nedströmspipeline i Synapse-arbetsytan för att flytta data från CDM-mappen till synapse-dedikerad SQL-pool.

Med den här lösningen kan du omvandla data till tabellformat när de skrivs till CDM-mappen. Du bör överväga den här lösningen om du vill omvandla FHIR-data till ett anpassat schema när de har extraherats från FHIR-servern.

Följ OSS-dokumentationen för installations- och användningsinstruktioner.

Läser in exporterade data till Synapse med T-SQL

I den här metoden använder du FHIR-åtgärden $export för att kopiera FHIR-resurser till en Azure Data Lake Gen 2-bloblagring (ADL Gen 2) i NDJSON format. Därefter läser du in data från lagringen till serverlösa eller dedikerade SQL-pooler i Synapse med hjälp av T-SQL. Du kan konvertera de här stegen till en robust pipeline för dataförflyttning med hjälp av Synapse-pipelines.

Azure Storage till Synapse med $export.

Använda $export för att kopiera data

Konfigurera $export på FHIR-servern

Azure API för FHIR implementerar åtgärden $export som definieras av FHIR-specifikationen för att exportera alla eller en filtrerad delmängd av FHIR-data i NDJSON format. Dessutom stöder den avidentifierad export för att anonymisera FHIR-data under exporten.

Om du vill exportera FHIR-data till Azure Blob Storage måste du först konfigurera FHIR-servern för att exportera data till lagringskontot. Du måste (1) aktivera hanterad identitet, (2) gå till Access Control i lagringskontot och lägga till rolltilldelning, (3) välja ditt lagringskonto för $export. Mer steg för steg finns här.

Du kan konfigurera servern för att exportera data till alla typer av Azure-lagringskonton, men vi rekommenderar att du exporterar till ADL Gen 2 för bästa justering med Synapse.

Använda $export kommandot

När du har konfigurerat FHIR-servern kan du följa dokumentationen för att exportera dina FHIR-resurser på system-, patient- eller gruppnivå. Du kan till exempel exportera alla dina FHIR-data relaterade till patienterna i ett Group med följande $export kommando, där du anger ditt ADL Gen 2-bloblagringsnamn i fältet {{BlobContainer}}:

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

Du kan också använda _type parametern i anropet $export ovan för att begränsa de resurser som du vill exportera. Följande anrop exporterar till exempel bara Patient, MedicationRequestoch Observation resurser:

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

Mer information om de olika parametrar som stöds finns i vårt $export sidavsnitt om frågeparametrarna.

Använda Synapse för analys

Skapa en Synapse-arbetsyta

Innan du använder Synapse behöver du en Synapse-arbetsyta. Du skapar en Azure Synapse Analytics-tjänst på Azure Portal. Mer stegvis guide finns här. Du behöver ett ADLSGEN2 konto för att skapa en arbetsyta. Din Azure Synapse arbetsyta använder det här lagringskontot för att lagra dina Synapse-arbetsytedata.

När du har skapat en arbetsyta kan du visa din arbetsyta i Synapse Studio genom att logga in på arbetsytan på https://web.azuresynapse.neteller starta Synapse Studio i Azure Portal.

Skapa en länkad tjänst mellan Azure Storage och Synapse

Om du vill kopiera dina data till Synapse måste du skapa en länkad tjänst som ansluter ditt Azure Storage-konto, där du har exporterat dina data, med Synapse. Fler steg-för-steg-instruktioner finns här.

  1. I Synapse Studio bläddrar du till fliken Hantera och under Externa anslutningar väljer du Länkade tjänster.
  2. Välj Ny för att lägga till en ny länkad tjänst.
  3. Välj Azure Data Lake Storage Gen2 i listan och välj Fortsätt.
  4. Ange dina autentiseringsuppgifter. Välj Skapa när du är klar.

Nu när du har en länkad tjänst mellan ADL Gen 2-lagringen och Synapse är du redo att använda Synapse SQL-pooler för att läsa in och analysera dina FHIR-data.

Bestäm mellan serverlös och dedikerad SQL-pool

Azure Synapse Analytics erbjuder två olika SQL-pooler, en serverlös SQL-pool och en dedikerad SQL-pool. Serverlös SQL-pool ger flexibiliteten att fråga data direkt i bloblagringen med hjälp av den serverlösa SQL-slutpunkten utan någon resursetablering. Den dedikerade SQL-poolen har bearbetningskraft för höga prestanda och samtidighet, och rekommenderas för lagringsfunktioner i företagsskala. Mer information om de två SQL-poolerna finns på sidan för Synapse-dokumentation om SQL-arkitektur.

Använda serverlös SQL-pool

Eftersom den är serverlös finns det ingen infrastruktur att konfigurera eller kluster att underhålla. Du kan börja fråga efter data från Synapse Studio så snart arbetsytan har skapats.

Följande fråga kan till exempel användas för att transformera markerade fält från Patient.ndjson till en tabellstruktur:

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', 
       ...
) 

I frågan ovan OPENROWSET kommer funktionen åt filer i Azure Storage och OPENJSON parsar JSON-text och returnerar JSON-indataegenskaperna som rader och kolumner. Varje gång den här frågan körs läser den serverlösa SQL-poolen filen från bloblagringen, parsar JSON och extraherar fälten.

Du kan också materialisera resultaten i Parquet-format i en extern tabell för att få bättre frågeprestanda, enligt nedan:

-- 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 --

Använda dedikerad SQL-pool

Dedikerad SQL-pool stöder hanterade tabeller och en hierarkisk cache för minnesintern prestanda. Du kan importera stordata med enkla T-SQL-frågor och sedan använda kraften i den distribuerade frågemotorn för att köra analys med höga prestanda.

Det enklaste och snabbaste sättet att läsa in data från din lagring till en dedikerad SQL-pool är att använda COPY kommandot i T-SQL, som kan läsa CSV-, Parquet- och ORC-filer. Precis som i exempelfrågan nedan använder du COPY kommandot för att läsa in raderna NDJSON i en tabellstruktur.

-- 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

När du har JSON-raderna StagingPatient i tabellen ovan kan du skapa olika tabellformat för data med hjälp OPENJSON av funktionen och lagra resultaten i tabeller. Här är ett exempel på en SQL-fråga för att skapa en Patient tabell genom att extrahera några fält från resursen Patient :

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

Nästa steg

I den här artikeln har du lärt dig tre olika sätt att kopiera dina FHIR-data till Synapse.

Därefter kan du lära dig hur du kan avregistrera dina FHIR-data när du exporterar dem till Synapse för att skydda PHI.

FHIR® är ett registrerat varumärke som tillhör HL7 och används med tillstånd av HL7.