FHIR サービスから Azure Synapse Analytics にデータをコピーする

この記事では、Azure Health Data Services の FHIR® サービスから Azure Synapse Analytics にデータをコピーする 3 つの方法について説明します。これは、データ統合、エンタープライズ データ ウェアハウス、ビッグ データ分析を統合する無制限の分析サービスです。

FHIR を使用した Synapse 同期エージェント OSS ツールの使用

Note

FHIR to Synapse Sync Agent は MIT ライセンスでリリースされたオープンソース ツールであり、Azure サービスの Microsoft SLA の対象ではありません。

Synapse Sync Agent への 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 documentation に従ってください。

FHIR を CDM パイプライン ジェネレーター OSS ツールに使用する

Note

FHIR から CDM パイプライン ジェネレーターは MIT ライセンスでリリースされたオープンソース ツールであり、Azure サービスの Microsoft SLA の対象ではありません。

CDM パイプライン ジェネレーターへの FHIR は、MIT ライセンスでリリースされた Microsoft OSS プロジェクトです。 これは、$export API を使用して FHIR サーバーからデータのスナップショットをコピーし、csv 形式に変換し、Azure Data Lake Storage Gen 2 の CDM フォルダー に書き込むための ADF パイプラインを生成するツールです。 このツールには、FHIR リソースとフィールドをテーブルに写像してフラット化する手順を含む、ユーザーが作成した構成ファイルが必要です。 Synapse ワークスペースでダウンストリーム パイプラインを作成する手順に従って、CDM フォルダーから Synapse 専用 SQL プールにデータを移動することもできます。

このソリューションを使うと、CDM フォルダーに書き込まれるときにデータを表形式に変換できます。 FHIR データを FHIR サーバーから抽出した後でカスタム スキーマに変換する場合は、このソリューションを検討する必要があります。

インストールと使用方法については、OSS documentation に従ってください。

T-SQL を使用してエクスポートされたデータを Synapse に読み込む

この方法では、FHIR $export操作を使用して、FHIR リソースを Azure Data Lake Gen 2 (ADL Gen 2) BLOB ストレージNDJSON形式でコピーします。 次に、T-SQL を使用して Synapse でストレージから サーバーレスまたは専用 SQL プール にデータを読み込みます。 Synapse パイプラインを使用して、これらの手順を堅牢なデータ移動パイプラインに変換できます。

$exportを使用して Azure Storage から Synapse に。

$exportを使用してデータをコピーする

FHIR サーバーでの $export の構成

Azure Health Data Services の FHIR サーバーは、FHIR 仕様で定義された $export 操作を実装して、FHIR データのすべてまたはフィルター処理されたサブセットを NDJSON 形式でエクスポートします。 さらに、エクスポート中に FHIR データを匿名化するために、匿名化エクスポートがサポートされます。

FHIR データを Azure Blob ストレージにエクスポートするには、まず、データをストレージ アカウントにエクスポートするように FHIR サーバーを構成する必要があります。 (1) マネージド ID を有効にする必要があります。(2) ストレージ アカウントで Access Control に移動し、ロールの割り当てを追加し、(3) $exportのストレージ アカウントを選択する必要があります。 詳細については、こちら 参照してください

任意の種類の Azure Storage アカウントにデータをエクスポートするようにサーバーを構成できますが、Synapse との最適な調整を行う場合は、ADL Gen 2 にエクスポートすることをお勧めします。

$export コマンドの使用

FHIR サーバーを構成したら、ドキュメントに従って、System、Patient、または Group レベルで FHIR リソースをエクスポートできます。 たとえば、次の $export コマンドを使用して、Group 内の患者に関連付けられているすべての FHIR データをエクスポートできます。ここでは、 フィールド {{BlobContainer}} に ADL Gen 2 BLOB ストレージ名を指定します。

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

前の$export呼び出しで _type パラメーターを使用して、エクスポートするリソースを制限することもできます。 たとえば、次の呼び出しでは、 PatientMedicationRequest、および Observation リソースのみがエクスポートされます。

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

サポートされているさまざまなパラメーターの詳細については、クエリ パラメーターに関する $export ページ セクションを参照してください。

Synapse for Analytics の使用

Synapse ワークスペースの作成

Synapse を使用する前に、Synapse ワークスペースが必要です。 Azure portal で Azure Synapse Analytics サービスを作成します。 詳細な手順については、こちら 参照してください。 ワークスペースを作成するには、ADLSGEN2 アカウントが必要です。 Azure Synapse ワークスペースでは、このストレージ アカウントを使用して、ワークスペース データを格納します。

ワークスペースを作成したら、 https://web.azuresynapse.netでワークスペースにサインインするか、Azure portal で Synapse Studio を起動することで、Synapse Studio でワークスペースを表示できます。

Azure Storage と Synapse の間のリンクされたサービスの作成

Synapse にデータをコピーするには、データをエクスポートした Azure Storage アカウントと Synapse を接続するリンクされたサービスを作成する必要があります。 詳細な手順については、こちら 参照してください

  1. Synapse Studio で、 Manage タブに移動し、 External 接続Linked services を選択します。
  2. 新しいリンク サービスを追加するには、[新規] を選択します。
  3. リストから [Azure Data Lake Storage Gen2] を選択し、[続行] を選択します。
  4. ご利用の認証資格情報を入力します。 入力し終えたら [作成] を選択します。

ADL Gen 2 ストレージと Synapse の間にリンクされたサービスが作成されたので、Synapse SQL プールを使用して FHIR データを読み込んで分析する準備ができました。

サーバーレスか専用 SQL プールかを決定する

Azure Synapse Analytics には、サーバーレス SQL プールと専用 SQL プールという 2 つの異なる SQL プールが用意されています。 サーバーレス SQL プールを使用すると、リソースをプロビジョニングすることなく、サーバーレス SQL エンドポイントを使用して BLOB ストレージ内のデータに対して直接クエリを実行できます。 専用 SQL プールは、ハイ パフォーマンスとコンカレンシーのための処理能力を備え、エンタープライズ規模のデータ ウェアハウス機能に推奨されます。 2 つの 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 ストレージからファイルが読み取られ、JSON が解析され、フィールドが抽出されます。

次のように、クエリのパフォーマンスを向上させるために、 External Table で 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 ファイルを読み取る COPY コマンドを T-SQL で使用することです。 次のクエリ例のように、 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 にコピーする 3 つの異なる方法について説明しました。

次に、PHI を保護するために、FHIR データを Synapse にエクスポートするときに FHIR データを識別解除する方法について説明します。

Note

FHIR® は HL7 の登録商標であり、HL7 の許可を得て使用しています。