SQL を使用した HealthLake データのクエリ - AWS HealthLake

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

SQL を使用した HealthLake データのクエリ

FHIR データを HealthLake データストアにインポートすると、ネストされた JSON FHIR データは同時に ETL プロセスを実行し、Amazon S3 の Apache Iceberg オープンテーブル形式で保存されます。HealthLake データストアの各 FHIR リソースタイプはテーブルに変換され、Amazon Athena を使用してクエリできます。テーブルは個別にクエリすることも、SQL ベースのクエリを使用してグループとしてクエリすることもできます。データストアの構造により、データは複数の異なるデータ型として Athena にインポートされます。これらのデータ型にアクセスできる SQL クエリの作成の詳細については、「Amazon Athena ユーザーガイド」の「複雑な型とネストされた構造を持つ配列のクエリ」を参照してください。 Amazon Athena

注記

このトピックのすべての例では、Synthea を使用して作成された架空のデータを使用します。Synthea データでプリロードされたデータストアの作成の詳細については、「」を参照してくださいHealthLake データストアの作成

リソースタイプの各要素について、FHIR 仕様は基数を定義します。要素の基数により、この要素を表示できる回数の下限と上限が定義されます。SQL クエリを作成するときは、これを考慮する必要があります。たとえば、リソースタイプ: 患者の一部の要素を見てみましょう。

  • 要素: Name FHIR 仕様はカーディナリティを に設定します0..*

    要素は配列としてキャプチャされます。

    [{ id = null, extension = null, use = official, _use = null, text = null, _text = null, family = Wolf938, _family = null, given = [Noel608], _given = null, prefix = null, _prefix = null, suffix = null, _suffix = null, period = null }]

    Athena では、リソースタイプがどのように取り込まれたかを確認するには、テーブルとビューでリソースタイプを検索します。この配列の要素にアクセスするには、ドット表記を使用できます。given と の値にアクセスする簡単な例を次に示しますfamily

    SELECT name[1].given as FirstName, name[1].family as LastName FROM Patient
  • 要素: MaritalStatus FHIR 仕様では、基数を に設定します0..1

    この要素は JSON としてキャプチャされます。

    { id = null, extension = null, coding = [ { id = null, extension = null, system = http: //terminology.hl7.org/CodeSystem/v3-MaritalStatus, _system = null, version = null, _version = null, code = S, _code = null, display = Never Married, _display = null, userSelected = null, _userSelected = null } ], text = Never Married, _text = null }

    Athena では、リソースタイプがどのように取り込まれたかを確認するには、テーブルとビューでリソースタイプを検索します。JSON のキーと値のペアにアクセスするには、ドット表記を使用できます。配列ではないため、配列インデックスは必要ありません。の値にアクセスする簡単な例を次に示しますtext

    SELECT maritalstatus.text as MaritalStatus FROM Patient

JSON へのアクセスと検索の詳細については、Athena ユーザーガイドの「JSON のクエリ」を参照してください。

Athena データ操作言語 (DML) クエリステートメントは Trino に基づいています。Athena は Trino のすべての機能をサポートしているわけではなく、大きな違いがあります。詳細については、Amazon Athena ユーザーガイド」の「DML クエリ、関数、演算子」を参照してください。

さらに、Athena は HealthLake データストアのクエリを作成するときに発生する可能性のある複数のデータ型をサポートしています。Athena のデータ型の詳細については、Amazon Athena ユーザーガイド」の「Amazon Athena のデータ型」を参照してください。 Amazon Athena

Athena での SQL クエリの仕組みの詳細については、Amazon Athena ユーザーガイド」の「Amazon Athena の SQL リファレンス」を参照してください。 Amazon Athena

各タブには、Athena を使用して指定されたリソースタイプと関連する要素を検索する方法の例が表示されます。

Element: Extension

要素は、データストアにカスタムフィールドを作成するextensionために使用されます。

この例では、 Patientリソースタイプにある extension要素の機能にアクセスする方法を示します。

HealthLake データストアが Athena にインポートされると、リソースタイプの要素の解析は異なります。の構造elementは可変であるため、スキーマで完全に指定することはできません。この変動性を処理するために、配列内の要素は文字列として渡されます。

のテーブルの説明にはPatient、 とextension記述されている 要素が表示されます。つまりarray<string>、インデックス値を使用して配列の 要素にアクセスできます。ただし、文字列の要素にアクセスするには、 を使用する必要がありますjson_extract

以下は、患者テーブルにある extension要素からの 1 つのエントリです。

[{ "valueString": "Kerry175 Cummerata161", "url": "http://hl7.org/fhir/StructureDefinition/patient-mothersMaidenName" }, { "valueAddress": { "country": "DE", "city": "Hamburg", "state": "Hamburg" }, "url": "http://hl7.org/fhir/StructureDefinition/patient-birthPlace" }, { "valueDecimal": 0.0, "url": "http://synthetichealth.github.io/synthea/disability-adjusted-life-years" }, { "valueDecimal": 5.0, "url": "http://synthetichealth.github.io/synthea/quality-adjusted-life-years" } ]

これは有効な JSON ですが、Athena はそれを文字列として扱います。

この SQL クエリの例は、 要素patient-mothersMaidenNamepatient-birthPlace要素を含むテーブルを作成する方法を示しています。これらの要素にアクセスするには、異なる配列インデックスと json_extract.

SELECT extension[1], json_extract(extension[1], '$.valueString') AS MothersMaidenName, extension[2], json_extract(extension[2], '$.valueAddress.city') AS birthPlace FROM patient

JSON を含むクエリの詳細については、Amazon Athena ユーザーガイド」の「JSON からのデータの抽出」を参照してください。

Element: birthDate (Age)

Age は、FHIR の患者リソースタイプの要素ではありません。年齢に基づいてフィルタリングする検索の 2 つの例を次に示します。

age は 要素ではないため、SQL クエリbirthDateには を使用します。要素が FHIR にどのように取り込まれたかを確認するには、テーブルとビューでテーブル名を検索します。文字列型であることがわかります。

例 1: 年齢の値を計算する

このサンプル SQL クエリでは、組み込み SQL ツール current_dateと を使用してこれらのコンポーネントyearを抽出します。次に、これらを減算して、患者の実際の年齢を という列として返しますage

SELECT (year(current_date) - year(date(birthdate))) as age FROM patient

例 2: 以前に生まれ2019-01-01、 である患者のフィルタリングmale

SQL クエリでは、 CAST関数を使用してbirthDate要素をタイプ としてキャストする方法とDATEWHERE句の 2 つの条件に基づいてフィルタリングする方法を示します。要素はデフォルトで型文字列として取り込まれるCASTため、型として取り込む必要がありますDATE。その後、 <演算子を使用して、別の日付 と比較できます2019-01-01。を使用するとANDWHERE句に 2 番目の条件を追加できます。

SELECT birthdate FROM patient -- we convert birthdate (varchar) to date > cast that as date too WHERE CAST(birthdate AS DATE) < CAST('2019-01-01' AS DATE) AND gender = 'male'
Resource type: Location

この例では、都市名がアトルボロである Location リソースタイプ内の場所を検索します。

SELECT * FROM Location WHERE address.city='ATTLEBORO' LIMIT 10;
Element: Age
SELECT birthdate FROM patient -- we convert birthdate (varchar) to date > cast that as date too WHERE CAST(birthdate AS DATE) < CAST('2019-01-01' AS DATE) AND gender = 'male'
Resource type: Condition

リソースタイプの条件は、懸念レベルに達した問題に関連する診断データを保存します。HealthLake の統合医療自然言語処理 (NLP) は、DocumentReference Conditionリソースタイプで見つかった詳細に基づいて新しいリソースを生成します。新しいリソースが生成されると、HealthLake は タグを SYSTEM_GENERATED meta要素に追加します。このサンプル SQL クエリは、条件テーブルを検索し、結果が削除されたSYSTEM_GENERATED結果を返す方法を示しています。

HealthLake の統合自然言語処理 (NLP) の詳細については、「」を参照してくださいHealthLake の統合自然言語処理 (NLP)

SELECT * FROM condition WHERE meta.tag[1] is NULL

指定された文字列要素内で検索して、クエリをさらにフィルタリングすることもできます。modifierextension 要素には、一連の条件の生成に使用されたDocumentReferenceリソースに関する詳細が含まれます。ここでも、 json_extractを使用して、文字列として Athena に取り込まれるネストされた JSON 要素にアクセスする必要があります。

このサンプル SQL クエリは、特定の に基づいてCondition生成されたすべての を検索する方法を示していますDocumentReferenceCAST を使用して JSON 要素を文字列として設定し、 LIKEを使用して比較できるようにします。

SELECT meta.tag[1].display as SystemGenerated, json_extract(modifierextension[4], '$.valueReference.reference') as DocumentReference FROM condition WHERE meta.tag[1].display = 'SYSTEM_GENERATED' AND CAST(json_extract(modifierextension[4], '$.valueReference.reference') as VARCHAR) LIKE '%DocumentReference/67aa0278-8111-40d0-8adc-43055eb9d18d%'
Resource type: Observation

リソースタイプ「オブザベーション」は、患者、デバイス、またはその他のサブジェクトに関する測定値と簡単なアサーションを保存します。HealthLake の統合自然言語処理 (NLP) は、Observationリソースで見つかった詳細に基づいて新しいDocumentReferenceリソースを生成します。このサンプル SQL クエリにはWHERE meta.tag[1] is NULLコメントアウトが含まれています。つまり、SYSTEM_GENERATED結果が含まれます。

SELECT valueCodeableConcept.coding[1].code FROM Observation WHERE valueCodeableConcept.coding[1].code = '266919005' -- WHERE meta.tag[1] is NULL

この列は としてインポートされましたstruct。したがって、ドット表記を使用して内部の要素にアクセスできます。

Resource type: MedicationStatement

MedicationStatement は FHIR リソースタイプで、患者が現在使用している、現在使用している、または将来使用する薬剤に関する詳細を保存するために使用できます。HealthLake の統合医療自然言語処理 (NLP) は、DocumentReference リソースタイプで見つかったドキュメントに基づいて、新しいMedicationStatement リソースを生成します。新しいリソースが生成されると、HealthLake は タグSYSTEM_GENERATEDmeta要素に追加します。このサンプル SQL クエリは、識別子を使用して単一の患者に基づいてフィルタリングし、HealthLake の統合 NLP によって追加されたリソースを検索するクエリを作成する方法を示しています。

SELECT * FROM medicationstatement WHERE meta.tag[1].display = 'SYSTEM_GENERATED' AND subject.reference = 'Patient/0679b7b7-937d-488a-b48d-6315b8e7003b';

HealthLake の統合自然言語処理 (NLP) の詳細については、「」を参照してくださいHealthLake の統合自然言語処理 (NLP)