將資料從 Azure API for FHIR 複製到 Azure Synapse Analytics

在本文中,您將瞭解從 Azure API for FHIR 將資料複製到Azure Synapse Analytics的三種方式,這是一項無限制的分析服務,可將資料整合、企業資料倉儲和巨量資料分析結合在一起。

使用 FHIR 至 Synapse 同步代理程式 OSS 工具

注意

適用于 Synapse 同步代理程式的 FHIR是依據 MIT 授權發行的開放原始碼工具,且不受 Microsoft SLA for Azure 服務所涵蓋。

適用于 Synapse 同步代理程式的 FHIR是 MICROSOFT OSS 專案,在 MIT 授權下發行。 這是 Azure 函式,其會使用 FHIR 資源 API 從 FHIR 伺服器擷取資料、將其轉換成階層式 Parquet 檔案,並近乎即時地寫入 Azure Data Lake。 這也包含腳本,用來在指向 Parquet 檔案的 Synapse 無伺服器 SQL 集 區中建立外部資料表和檢視。

此解決方案可讓您使用 Synapse Studio、SSMS 和 Power BI 等工具來查詢整個 FHIR 資料。 您也可以直接從 Synapse Spark 集區存取 Parquet 檔案。 如果您想要近乎即時地存取所有 FHIR 資料,而且想要將自訂轉換延遲至下游系統,您應該考慮此解決方案。

請遵循 OSS 以取得安裝和使用指示。

使用 FHIR 至 CDM 管線產生器 OSS 工具

注意

FHIR to CDM 管線產生器是依據 MIT 授權發行的開放原始碼工具,且不受 Microsoft SLA for Azure 服務所涵蓋。

FHIR to CDM 管線產生器是在 MIT 授權下發行的 Microsoft OSS 專案。 這是一種工具,可用來使用 $export API 從 FHIR 伺服器複製資料的快照集、將它轉換成 csv 格式,以及寫入 Azure Data Lake Storage Gen 2 中的CDM 資料夾。 此工具需要使用者建立的組態檔,其中包含將專案和 FHIR 資源和欄位壓平合併成資料表的指示。 您也可以遵循在 Synapse 工作區中建立下游管線的指示,將資料從 CDM 資料夾移至 Synapse 專用 SQL 集區。

此解決方案可讓您將資料轉換成表格式格式,因為它會寫入 CDM 資料夾。 如果您想要在從 FHIR 伺服器擷取 FHIR 資料之後,將其轉換成自訂架構,您應該考慮此解決方案。

請遵循 OSS 以取得安裝和使用指示。

使用 T-SQL 將匯出的資料載入 Synapse

在此方法中,您會使用 FHIR 作業,以格式將 FHIR $export 資源複製到 Azure Data Lake Gen 2 (ADL Gen 2) Blob 儲存體NDJSON 。 接著,您會使用 T-SQL,將資料從儲存體載入 Synapse 中的 無伺服器或專用 SQL 集 區。 您可以使用 Synapse 管線,將這些步驟轉換成強固的資料移動管線。

使用 $export 對 Synapse 的 Azure 儲存體。

使用 $export 複製資料

$export在 FHIR 伺服器中設定

Azure API for FHIR 會 $export 實作 FHIR 規格所定義的作業,以格式匯出所有或篩選過的 FHIR 資料 NDJSON 子集。 此外,它支援 在匯出期間取消識別匯出 ,以匿名化 FHIR 資料。

若要將 FHIR 資料匯出至 Azure Blob 儲存體,您必須先設定 FHIR 伺服器,將資料匯出至儲存體帳戶。 您必須 (1) 啟用受控識別, (2) 移至儲存體帳戶中的存取控制並新增角色指派, (3) 選取您的儲存體帳戶。 $export 您可以 在這裡找到更多逐步說明。

您可以將伺服器設定為將資料匯出至任何類型的 Azure 儲存體帳戶,但建議您匯出至 ADL Gen 2,以便與 Synapse 保持最佳一致。

使用 $export 命令

設定 FHIR 伺服器之後,您可以遵循 ,在 [系統]、[病患] 或 [群組] 層級匯出 FHIR 資源。 例如,您可以使用下列 $export 命令匯出與 病患相關的 Group 所有 FHIR 資料,您可以在 欄位中 {{BlobContainer}} 指定 ADL Gen 2 Blob 儲存體名稱:

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

您也可以在上述呼叫中使用 _type$export 參數來限制您想要匯出的資源。 例如,下列呼叫只會 Patient 匯出 、 MedicationRequestObservation 資源:

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

如需所支援不同參數的詳細資訊,請參閱查詢 $export參數上的頁面區段。

使用 Synapse for Analytics

建立 Synapse 工作區

使用 Synapse 之前,您需要 Synapse 工作區。 您將在 Azure 入口網站 上建立 Azure Synapse Analytics 服務。 您可以 在這裡找到更多逐步指南。 您需要帳戶 ADLSGEN2 才能建立工作區。 您的Azure Synapse工作區會使用此儲存體帳戶來儲存 Synapse 工作區資料。

建立工作區之後,您可以在 Synapse Studio 中檢視工作區,方法是登入 上的 工作區 https://web.azuresynapse.net ,或在 Azure 入口網站 中啟動Synapse Studio。

在 Azure 儲存體與 Synapse 之間建立連結服務

若要將資料複製到 Synapse,您必須建立連結的服務,以連接已匯出資料的 Azure 儲存體帳戶與 Synapse。 您可以 在這裡找到更多逐步指示。

  1. 在 [Synapse Studio] 中,流覽至 [管理] 索引標籤,然後在 [外部連線] 底下選取[連結服務]。
  2. 選取 [新增 ] 以新增連結服務。
  3. 從清單中選取 [Azure Data Lake Storage Gen2],然後選取 [繼續]。
  4. 輸入您的驗證認證。 完成後,請選取 [建立]

現在,您的 ADL Gen 2 儲存體與 Synapse 之間已有連結服務,您已準備好使用 Synapse SQL 集區來載入和分析 FHIR 資料。

決定無伺服器和專用 SQL 集區

Azure Synapse分析提供兩個不同的 SQL 集區、無伺服器 SQL 集區和專用 SQL 集區。 無伺服器 SQL 集區可讓您使用無伺服器 SQL 端點直接在 Blob 儲存體中查詢資料,而不需要任何資源布建。 專用 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 儲存體中的檔案,並剖析 JSON 文字,並將 OPENJSON JSON 輸入屬性當做資料列和資料行傳回。 每次執行此查詢時,無伺服器 SQL 集區會從 Blob 儲存體讀取檔案、剖析 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 集區的最簡單且最快方式是使用 COPY T-SQL 中的 命令,其可讀取 CSV、Parquet 和 ORC 檔案。 如下列範例查詢所示,使用 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 資料表的 Patient 範例 SQL 查詢:

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 的三種不同方式。

接下來,您可以瞭解如何在匯出至 Synapse 時取消識別 FHIR 資料,以保護 PHI。

FHIR® 是 HL7 的注冊商標,可與 HL7 的許可權搭配使用。