將數據從 FHIR 服務複製到 Azure Synapse Analytics
在本文中,您將學習三種方式,將數據從 Azure Health Data Services 中的 FHIR® 服務複製到 Azure Synapse Analytics,這是一項無限制的分析服務,可將數據整合、企業數據倉儲和巨量數據分析結合在一起。
- 使用 FHIR 至 Synapse 同步代理程式 OSS 工具
- 使用 FHIR 至 CDM 管線產生器 OSS 工具
- 使用$export並使用 T-SQL 將數據載入 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 專案。 它是使用 $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 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
匯出、 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 儲存體 中的檔案,並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 的許可下使用。