FHIR サービスから Azure Synapse Analytics にデータをコピーする
この記事では、Azure Health Data Services の FHIR® サービスから Azure Synapse Analytics にデータをコピーする 3 つの方法について説明します。これは、データ統合、エンタープライズ データ ウェアハウス、ビッグ データ分析を統合する無制限の分析サービスです。
- FHIR to Synapse Sync Agent OSS ツールを使用する
- FHIR to CDM パイプライン ジェネレーター OSS ツールを使用する
- $exportを使用し、T-SQL を使用して 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 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
パラメーターを使用して、エクスポートするリソースを制限することもできます。 たとえば、次の呼び出しでは、 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 ワークスペースでは、このストレージ アカウントを使用して、ワークスペース データを格納します。
ワークスペースを作成したら、 https://web.azuresynapse.netでワークスペースにサインインするか、Azure portal で Synapse Studio を起動することで、Synapse Studio でワークスペースを表示できます。
Azure Storage と Synapse の間のリンクされたサービスの作成
Synapse にデータをコピーするには、データをエクスポートした Azure Storage アカウントと Synapse を接続するリンクされたサービスを作成する必要があります。 詳細な手順については、こちら 参照してください。
- Synapse Studio で、 Manage タブに移動し、 External 接続で Linked services を選択します。
- 新しいリンク サービスを追加するには、[新規] を選択します。
- リストから [Azure Data Lake Storage Gen2] を選択し、[続行] を選択します。
- ご利用の認証資格情報を入力します。 入力し終えたら [作成] を選択します。
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 の許可を得て使用しています。