FHIR 서비스에서 Azure Synapse Analytics로 데이터 복사

이 문서에서는 Azure Health Data Services의 FHIR 서비스에서 데이터 통합, 엔터프라이즈 데이터 웨어하우징 및 빅 데이터 분석을 결합하는 무제한 분석 서비스인 Azure Synapse Analytics로 데이터를 복사하는 세 가지 방법을 알아봅니다.

FHIR을 사용하여 Synapse 동기화 에이전트 OSS 도구

참고

FHIR에서 Synapse 동기화 에이전트로의 FHIR은 MIT 라이선스로 릴리스된 오픈 소스 도구이며 Azure 서비스에 대한 Microsoft SLA의 적용을 받지 않습니다.

FHIR에서 Synapse 동기화 에이전트로의 FHIR은 MIT 라이선스에 따라 릴리스된 Microsoft OSS 프로젝트입니다. FHIR 리소스 API를 사용하여 FHIR 서버에서 데이터를 추출하고, 계층적 Parquet 파일로 변환하고, 거의 실시간으로 Azure Data Lake에 쓰는 Azure 함수입니다. 여기에는 Parquet 파일을 가리키는 Synapse 서버리스 SQL 풀 에서 외부 테이블 및 뷰를 만드는 스크립트도 포함됩니다.

이 솔루션을 사용하면 Synapse Studio, SSMS 및 Power BI와 같은 도구를 사용하여 전체 FHIR 데이터에 대해 쿼리할 수 있습니다. Synapse Spark 풀에서 직접 Parquet 파일에 액세스할 수도 있습니다. 거의 실시간으로 모든 FHIR 데이터에 액세스하고 다운스트림 시스템으로의 사용자 지정 변환을 연기하려는 경우 이 솔루션을 고려해야 합니다.

설치 및 사용 지침은 OSS 설명서를 따릅니다.

FHIR을 CDM 파이프라인 생성기 OSS 도구로 사용

참고

FHIR에서 CDM으로의 파이프라인 생성기는 MIT 라이선스에 따라 릴리스된 오픈 소스 도구이며 Azure 서비스용 Microsoft SLA에서 다루지 않습니다.

FHIR-CDM 파이프라인 생성기는 MIT 라이선스에 따라 릴리스된 Microsoft OSS 프로젝트입니다. $export API를 사용하여 FHIR 서버에서 데이터 스냅샷 복사하고, csv 형식으로 변환하고, Azure Data Lake Storage Gen 2의 CDM 폴더에 쓰기 위한 ADF 파이프라인을 생성하는 도구입니다. 이 도구에는 FHIR 리소스 및 필드를 테이블로 프로젝션하고 평면화하는 지침이 포함된 사용자가 만든 구성 파일이 필요합니다. Synapse 작업 영역에서 다운스트림 파이프라인을 만들기 위한 지침에 따라 CDM 폴더에서 Synapse 전용 SQL 풀로 데이터를 이동할 수도 있습니다.

이 솔루션을 사용하면 데이터를 CDM 폴더에 기록할 때 테이블 형식으로 변환할 수 있습니다. FHIR 데이터를 FHIR 서버에서 추출한 후 사용자 지정 스키마로 변환하려는 경우 이 솔루션을 고려해야 합니다.

설치 및 사용 지침은 OSS 설명서를 따릅니다.

T-SQL을 사용하여 Synapse로 내보낸 데이터 로드

이 방법에서는 FHIR $export 작업을 사용하여 형식의 Azure Data Lake Gen 2(ADL Gen 2) Blob StorageNDJSON FHIR 리소스를 복사합니다. 그런 다음, T-SQL을 사용하여 Synapse의 서버리스 또는 전용 SQL 풀 에 스토리지의 데이터를 로드합니다. Synapse 파이프라인을 사용하여 이러한 단계를 강력한 데이터 이동 파이프라인으로 변환할 수 있습니다.

$export 사용하여 Synapse에 Azure Storage.

를 사용하여 $export 데이터 복사

FHIR 서버에서 구성 $export

Azure Health Data Services의 FHIR 서버는 FHIR 사양에 정의된 작업을 구현 $export 하여 FHIR 데이터의 전체 또는 필터링된 하위 집합을 형식으로 NDJSON 내보냅니다. 또한 내보내기 중에 FHIR 데이터를 익명화하기 위해 식별되지 않은 내보내기를 지원합니다.

FHIR 데이터를 Azure Blob Storage로 내보내려면 먼저 스토리지 계정으로 데이터를 내보내도록 FHIR 서버를 구성해야 합니다. (1) 관리 ID를 사용하도록 설정하고, (2) 스토리지 계정의 Access Control 이동하여 역할 할당을 추가해야 합니다. (3) 에 대한 $export스토리지 계정을 선택해야 합니다. 추가 단계별 단계는 여기에서 찾을 수 있습니다.

모든 종류의 Azure Storage 계정으로 데이터를 내보내도록 서버를 구성할 수 있지만 Synapse와 가장 잘 맞도록 ADL Gen 2로 내보내는 것이 좋습니다.

명령 사용 $export

FHIR 서버를 구성한 후 설명서 에 따라 시스템, 환자 또는 그룹 수준에서 FHIR 리소스를 내보낼 수 있습니다. 예를 들어 다음 $export 명령을 사용하여 의 환자 Group 와 관련된 모든 FHIR 데이터를 내보낼 수 있습니다. 이 명령은 필드에서 {{BlobContainer}}ADL Gen 2 Blob Storage 이름을 지정합니다.

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

위의 호출에서 매개 변수를 $export 사용하여 _type 내보내려는 리소스를 제한할 수도 있습니다. 예를 들어 다음 호출은 , MedicationRequestObservation 리소스만 Patient내보냅니다.

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

지원되는 다양한 매개 변수에 대한 자세한 내용은 쿼리 매개 변수에서 페이지 섹션을 $export 검사.

분석용 Synapse 사용

Synapse 작업 영역 만들기

Synapse를 사용하기 전에 Synapse 작업 영역이 필요합니다. Azure Portal Azure Synapse Analytics 서비스를 만듭니다. 추가 단계별 가이드는 여기에서 찾을 수 있습니다. 작업 영역을 만들려면 계정이 필요합니다 ADLSGEN2 . Azure Synapse 작업 영역에서는 이 스토리지 계정을 사용하여 Synapse 작업 영역 데이터를 저장합니다.

작업 영역을 만든 후 에서 작업 영역에 로그인하거나 Azure Portal Synapse Studio 시작하여 Synapse Studio 작업 영역을 https://web.azuresynapse.net볼 수 있습니다.

Azure Storage와 Synapse 간에 연결된 서비스 만들기

Synapse에 데이터를 복사하려면 Synapse를 사용하여 데이터를 내보낸 Azure Storage 계정을 연결하는 연결된 서비스를 만들어야 합니다. 자세한 단계별 지침은 여기에서 찾을 수 있습니다.

  1. Synapse Studio 관리 탭으로 이동하고 외부 연결에서 연결된 서비스를 선택합니다.
  2. 새로 만들기를 선택하여 새 연결된 서비스를 추가합니다.
  3. 목록에서 Azure Data Lake Storage Gen2 선택하고 계속을 선택합니다.
  4. 인증 자격 증명을 입력합니다. 작업을 완료하면 만들기를 선택합니다.

이제 ADL Gen 2 스토리지와 Synapse 간에 연결된 서비스가 있으므로 Synapse SQL 풀을 사용하여 FHIR 데이터를 로드하고 분석할 준비가 되었습니다.

서버리스 및 전용 SQL 풀 중에서 결정

Azure Synapse Analytics는 서버리스 SQL 풀과 전용 SQL 풀의 두 가지 SQL 풀을 제공합니다. 서버리스 SQL 풀은 리소스 프로비저닝 없이 서버리스 SQL 엔드포인트를 사용하여 Blob Storage에서 직접 데이터를 쿼리할 수 있는 유연성을 제공합니다. 전용 SQL 풀은 고성능 및 동시성을 위한 처리 능력을 갖추고 있으며 엔터프라이즈 규모 데이터 웨어하우징 기능에 권장됩니다. 두 SQL 풀에 대한 자세한 내용은 SQL 아키텍처의 Synapse 설명서 페이지를 검사.

서버리스 SQL 풀 사용

서버리스이므로 설치할 인프라나 유지 관리할 클러스터가 없습니다. 작업 영역을 만드는 즉시 Synapse Studio 데이터 쿼리를 시작할 수 있습니다.

예를 들어 다음 쿼리를 사용하여 선택한 필드를 에서 Patient.ndjson 테이블 형식 구조로 변환할 수 있습니다.

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

위의 쿼리에서 함수는 OPENROWSET Azure Storage의 파일에 액세스하고 OPENJSON JSON 텍스트를 구문 분석하고 JSON 입력 속성을 행 및 열로 반환합니다. 이 쿼리가 실행될 때마다 서버리스 SQL 풀은 Blob Storage에서 파일을 읽고 JSON을 구문 분석하고 필드를 추출합니다.

아래와 같이 결과를 외부 테이블에서 Parquet 형식으로 구체화하여 쿼리 성능을 높일 수도 있습니다.

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

전용 SQL 풀 사용

전용 SQL 풀은 메모리 내 성능을 위해 관리 테이블 및 계층적 캐시를 지원합니다. 간단한 T-SQL 쿼리를 사용하여 빅 데이터를 가져온 다음 분산 쿼리 엔진의 기능을 사용하여 고성능 분석을 실행할 수 있습니다.

스토리지에서 전용 SQL 풀로 데이터를 로드하는 가장 간단하고 빠른 방법은 CSV, Parquet 및 ORC 파일을 읽을 수 있는 T-SQL에서 명령을 사용하는 COPY 것입니다. 아래 예제 쿼리에서와 같이 명령을 사용하여 COPY 행을 NDJSON 테이블 형식 구조로 로드합니다.

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

위의 표에 StagingPatient JSON 행이 있으면 함수를 사용하여 OPENJSON 데이터의 다른 테이블 형식을 만들고 결과를 테이블에 저장할 수 있습니다. 리소스에서 몇 가지 필드를 추출하여 테이블을 만드는 Patient 샘플 SQL 쿼리는 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

다음 단계

이 문서에서는 FHIR 데이터를 Synapse에 복사하는 세 가지 방법을 알아보았습니다.

다음으로, PHI를 보호하기 위해 Synapse로 내보내는 동안 FHIR 데이터를 식별 해제하는 방법에 대해 알아볼 수 있습니다.

FHIR®은 HL7의 등록 상표이며 HL7 의 권한으로 사용됩니다.