共用方式為


將數據從 FHIR 服務複製到 Azure Synapse Analytics

在本文中,您將學習三種方式,將數據從 Azure Health Data Services 中的 FHIR® 服務複製到 Azure Synapse Analytics,這是一項無限制的分析服務,可將數據整合、企業數據倉儲和巨量數據分析結合在一起。

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

注意

FHIR to Synapse Sync Agent 是根據 MIT 授權發行的 開放原始碼 工具,且不受 Azure 服務的 Microsoft SLA 所涵蓋。

FHIR 至 Synapse 同步代理程式 是根據 MIT 授權發行Microsoft OSS 專案。 這是 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 授權發行的 開放原始碼 工具,且不受 Azure 服務的 Microsoft SLA 所涵蓋。

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 將 Azure 記憶體儲存至 Synapse。

使用 $export 來複製數據

$export在 FHIR 伺服器中設定

Azure Health Data Services 中的 FHIR 伺服器會 $export 實作 FHIR 規格所定義的作業,以匯出格式的所有或篩選的 FHIR 數據 NDJSON 子集。 此外,它支援 在匯出 期間取消識別匯出以匿名 FHIR 數據。

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

您可以將伺服器設定為將數據匯出至任何類型的 Azure 儲存器帳戶,但建議您匯出至 ADL Gen 2,以獲得最佳與 Synapse 的一致性。

Using $export 命令

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

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

您也可以在上述$export呼叫中使用 _type 參數來限制您想要匯出的資源。 例如,下列呼叫只會 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 Analytics 提供兩個不同的 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 儲存體 中的檔案,並OPENJSON剖析 JSON 文字,並將 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 的三種不同的方式。

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

注意

FHIR® 是 HL7 的註冊商標,在 HL7 的許可下使用。