將數據從 Azure API for FHIR 複製到 Azure Synapse Analytics
重要
Azure API for FHIR 將於 2026 年 9 月 30 日淘汰。 請依照移轉策略,在該日期前轉換至 Azure 健康資料服務 FHIR® 服務。 由於 Azure API for FHIR 已淘汰,因此從 2025 年 4 月 1 日開始,將不允許新的部署。 Azure 健康資料服務 FHIR 服務是 Azure API for FHIR 的進化版本,可讓客戶透過與其他 Azure 服務整合來管理 FHIR、DICOM 和醫療技術服務。
在本文中,您將學習三種方式,將數據從 Azure API for FHIR® 複製到 Azure Synapse Analytics,這是一項無限制的分析服務,可將數據整合、企業數據倉儲和巨量數據分析結合在一起。 如下所示。
- 使用 FHIR 至 Synapse 同步代理程式 OSS 工具
- 使用 FHIR 至 CDM 管線產生器 OSS 工具
- 使用 T-SQL 將數據
$export
載入 Synapse
使用 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 專案。 這是產生ADF管線的工具,可用來使用 $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
來複製數據
$export
在 FHIR 伺服器中設定
Azure API for 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}}
您也可以使用 _type
上述 $export
呼叫中的 參數來限制您想要匯出的資源。 例如,下列呼叫只會 Patient
匯出、 MedicationRequest
和 Observation
資源:
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 導出數據。 如需更多逐步指示,請參閱 這裡。
- 在 Synapse Studio 中,流覽至 [管理] 索引標籤。在 [外部連線] 底下,選取 [鏈接服務]。
- 選取 [ 新增 ] 以新增鏈接服務。
- 從清單中選取 [Azure Data Lake Storage Gen2 ],然後選取 [ 繼續]。
- 輸入您的驗證認證。 完成後,請選取 [建立]。
現在,您的 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 儲存體 中的檔案,並剖析 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 的三種不同的方式。
接下來,您可以瞭解如何在將 FHIR 數據匯出至 Synapse 時,如何取消識別 FHIR 數據,以保護個人健康資訊(PHI)。
注意
FHIR® 是 HL7 的註冊商標,在 HL7 的許可下使用。