Azure API for FHIR から Azure Synapse Analytics にデータをコピーする
重要
Azure API for FHIR は、2026 年 9 月 30 日に廃止されます。 移行戦略に従って、その日までに Azure Health Data Services FHIR® サービスに切り替えてください。 Azure API for FHIR が廃止されたため、2025 年 4 月 1 日以降、新しいデプロイは許可されません。 Azure Health Data Services FHIR サービス は、お客様が他の Azure サービスへの統合を使用して、FHIR、DICOM、および MedTech サービスを管理できるようにする、進化したバージョンの Azure API for FHIR です。
この記事では、Azure API for FHIR® からデータを Azure Synapse Analytics にコピーする 3 つの方法について説明します。これは、データ統合、エンタープライズ データ ウェアハウス、ビッグ データ分析を組み合わせる無制限の分析サービスです。 これらは次のとおりです。
- FHIR to Synapse Sync Agent OSS ツールを使用する
- FHIR to CDM パイプライン ジェネレーター OSS ツールを使用する
- T-SQL を使用して
$export
を使用して Synapse にデータを読み込む
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
を使用してデータをコピーする
FHIR サーバーでの $export
の構成
Azure API for FHIR では、FHIR 仕様で定義された $export
操作を実装して、FHIR データのすべてまたはフィルター処理されたサブセットを NDJSON
形式でエクスポートします。 さらに、エクスポート中に FHIR データを匿名化するために、匿名化エクスポートがサポートされます。
FHIR データを Azure Blob ストレージにエクスポートするには、まず、データをストレージ アカウントにエクスポートするように FHIR サーバーを構成する必要があります。 (1) マネージド ID を有効にする必要があります。(2) ストレージ アカウントのアクセス制御に移動してロールの割り当てを追加し、(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
パラメーターを使用して、エクスポートするリソースを制限することもできます。 たとえば、次の呼び出しでは、 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 portal で Azure Synapse Analytics サービスを作成する必要があります。 詳細な手順については、こちら 参照してください。 ワークスペースを作成するには、ADLSGEN2
アカウントが必要です。 Azure Synapse ワークスペースでは、このストレージ アカウントを使用して Synapse ワークスペース データを格納します。
ワークスペースを作成したら、 https://web.azuresynapse.netでワークスペースにサインインするか、Azure portal で Synapse Studio を起動することで、Synapse Studio でワークスペースを表示できます。
Azure Storage と Synapse の間のリンクされたサービスの作成
Synapse にデータをコピーするには、Synapse を使用してデータをエクスポートした Azure Storage アカウントに接続するリンクされたサービスを作成する必要があります。 詳細な手順については、こちら 参照してください。
- Synapse Studio で、 Manage タブを参照します。[ 外部接続で、 リンクされたサービスを選択します。
- 新しいリンク サービスを追加するには、[新規] を選択します。
- 一覧から Azure Data Lake Storage Gen2 を選択し、 Continue を選択します。
- ご利用の認証資格情報を入力します。 入力し終えたら [作成] を選択します。
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 の許可を得て使用しています。