使用 SQL 查詢 HealthLake 資料 - AWS HealthLake

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 SQL 查詢 HealthLake 資料

當您將 FHIR 資料匯入 HealthLake 資料存放區時,巢狀 JSON FHIR 資料會同時進行 ETL 程序,並以 Apache Iceberg 開放資料表格式儲存在 Amazon S3 中。您 HealthLake 資料存放區中的每個 FHIR 資源類型都會轉換為資料表,其中可以使用 Amazon Athena 進行查詢。資料表可以個別查詢,也可以使用 SQL 型查詢做為群組。由於資料存放區的結構,您的資料會以多種不同的資料類型匯入 Athena。若要進一步了解如何建立可存取這些資料類型的 SQL 查詢,請參閱《Amazon Athena 使用者指南》中的查詢具有複雜類型和巢狀結構的陣列

注意

本主題中的所有範例都使用使用 Synthea 建立的虛構資料。若要進一步了解如何建立預先載入 Synthea 資料的資料存放區,請參閱 建立 HealthLake 資料存放區

對於資源類型中的每個元素,FHIR 規格會定義基數。元素的基數會定義此元素可顯示多少次的下限和上限。建構 SQL 查詢時,您必須將此納入考量。例如,我們來看看資源類型中的一些元素:病患

  • 元素:名稱 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 Data Manipulation Language (DML) 查詢陳述式是以 Trino 為基礎。Athena 不支援 Trino 的所有功能,並且存在顯著差異。若要進一步了解,請參閱《Amazon Athena 使用者指南》中的 DML 查詢、函數和運算子

此外,Athena 支援您在建立 HealthLake 資料存放區查詢時可能遇到的多種資料類型。若要進一步了解 Athena 中的資料類型,請參閱《Amazon Athena 使用者指南》中的 Amazon Athena 中的資料類型Amazon Athena

若要進一步了解 SQL 查詢如何在 Athena 中運作,請參閱《Amazon Athena 使用者指南》中的 Amazon Athena 的 SQL 參考Amazon Athena

每個索引標籤顯示如何使用 Athena 搜尋指定資源類型和相關元素的範例。

Element: Extension

元素extension用於在資料存放區中建立自訂欄位。

此範例說明如何存取 Patient 資源類型中找到的 extension元素功能。

當您的 HealthLake 資料存放區匯入 Athena 時,資源類型的元素會以不同的方式剖析。由於 的結構element是可變的,因此無法在結構描述中完全指定。為了處理該變異性,陣列內的元素會以字串形式傳遞。

在 的資料表描述中Patient,您可以看到extension描述為 的元素array<string>,這表示您可以使用索引值來存取陣列的元素。不過,若要存取字串的元素,您必須使用 json_extract

以下是在患者資料表中找到的 extension元素的單一項目。

[{ "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)

年齡不是 FHIR 中病患資源類型的元素。以下是根據年齡篩選的搜尋的兩個範例。

由於年齡不是 元素,因此我們會將 birthDate用於 SQL 查詢。若要查看 元素如何導入 FHIR,請在資料表和檢視下搜尋資料表名稱。您可以看到它是類型字串

範例 1:計算存留期的值

在此範例 SQL 查詢中,我們使用內建的 SQL 工具和 current_dateyear來擷取這些元件。然後,我們將它們減去,以傳回病患的實際年齡作為稱為 的資料欄age

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

範例 2:篩選之前出生且2019-01-01為 的患者male

SQL 查詢說明如何使用 CAST函數將birthDate元素轉換為類型 DATE,以及如何根據 WHERE子句中的兩個條件進行篩選。由於元素預設會擷取為類型字串,因此我們必須CAST將其擷取為類型 DATE。然後,您可以使用 < 運算子將其與不同的日期 進行比較2019-01-01。透過使用 AND,您可以將第二個條件新增至 WHERE子句。

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

此範例顯示搜尋城市名稱為 Attleboro 的位置資源類型內的位置。

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_GENERATEDmeta元素。此 SQL 查詢範例示範如何搜尋條件資料表,並傳回已移除SYSTEM_GENERATED結果的結果。

若要進一步了解 HealthLake 的整合式自然語言處理 (NLP),請參閱 HealthLake 的整合式自然語言處理 (NLP)

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

您也可以在指定的字串元素內搜尋,進一步篩選查詢。modifierextension 元素包含有關哪些DocumentReference資源用於產生一組條件的詳細資訊。同樣地,您必須使用 json_extract來存取做為字串帶入 Athena 的巢狀 JSON 元素。

此 SQL 查詢範例示範如何搜尋根據特定 Condition產生的所有 DocumentReference。使用 將 JSON 元素CAST設定為字串,以便您可以使用 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

資源類型 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)