View a markdown version of this page

Interroger des HealthLake données avec SQL - AWS HealthLake

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Interroger des HealthLake données avec SQL

Lorsque vous importez vos données FHIR dans un magasin de HealthLake données, les données JSON FHIR imbriquées sont soumises simultanément à un processus ETL et sont stockées au format de table ouverte Apache Iceberg dans Amazon S3. Chaque type de ressource FHIR de votre banque de HealthLake données est converti en une table, dans laquelle il peut être interrogé à l'aide d'Amazon Athena. Les tables peuvent être interrogées individuellement ou en groupe à l'aide SQL-based de requêtes. En raison de la structure des banques de données, vos données sont importées dans Athena sous la forme de différents types de données. Pour en savoir plus sur la création de requêtes SQL permettant d'accéder à ces types de données, consultez la section Tableaux de requêtes comportant des types complexes et des structures imbriquées dans le guide de l'utilisateur Amazon Athena.

Note

Tous les exemples de cette rubrique utilisent des données fictives créées à l'aide de Synthea. Pour en savoir plus sur la création d'un magasin de données préchargé avec des données Synthea, consultez. Création d'un magasin HealthLake de données

Pour chaque élément d'un type de ressource, la spécification FHIR définit une cardinalité. La cardinalité d'un élément définit les limites inférieure et supérieure du nombre de fois que cet élément peut apparaître. Lorsque vous créez une requête SQL, vous devez en tenir compte. Par exemple, examinons certains éléments de Type de ressource : Patient.

  • Élément : Nom La spécification FHIR définit la cardinalité comme. 0..*

    L'élément est capturé sous forme de tableau.

    [{ 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 }]

    Dans Athena, pour voir comment un type de ressource a été ingéré, recherchez-le dans Tables et vues. Pour accéder aux éléments de ce tableau, vous pouvez utiliser la notation par points. Voici un exemple simple qui permettrait d'accéder aux valeurs de given etfamily.

    SELECT name[1].given as FirstName, name[1].family as LastName FROM Patient
  • Élément : MaritalStatus La spécification FHIR définit la cardinalité comme. 0..1

    Cet élément est capturé au format 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 }

    Dans Athena, pour voir comment un type de ressource a été ingéré, recherchez-le dans Tables et vues. Pour accéder aux paires clé-valeur dans le JSON, vous pouvez utiliser la notation par points. Comme il ne s'agit pas d'un tableau, aucun index de tableau n'est requis. Voici un exemple simple qui permettrait d'accéder à la valeur detext.

    SELECT maritalstatus.text as MaritalStatus FROM Patient

Pour en savoir plus sur l'accès et la recherche de JSON, consultez la section Interroger JSON dans le guide de l'utilisateur d'Athena.

Les instructions de requête DML (Athena Data Manipulation Language) sont basées sur Trino. Athena ne prend pas en charge toutes les fonctionnalités de Trino, et il existe des différences importantes. Pour en savoir plus, consultez la section Requêtes, fonctions et opérateurs DML dans le guide de l'utilisateur Amazon Athena.

En outre, Athena prend en charge plusieurs types de données que vous pouvez rencontrer lors de la création de requêtes dans votre banque de HealthLake données. Pour en savoir plus sur les types de données dans Athena, consultez la section Types de données dans Amazon Athena dans le guide de l'utilisateur Amazon Athena.

Pour en savoir plus sur le fonctionnement des requêtes SQL dans Athena, consultez la référence SQL pour Amazon Athena dans le guide de l'utilisateur Amazon Athena.

Chaque onglet présente des exemples de recherche sur les types de ressources spécifiés et les éléments associés à l'aide d'Athena.

Element: Extension

L'élément extension est utilisé pour créer des champs personnalisés dans un magasin de données.

Cet exemple vous montre comment accéder aux fonctionnalités de l'extensionélément présent dans le type de Patient ressource.

Lorsque votre banque de HealthLake données est importée dans Athena, les éléments d'un type de ressource sont analysés différemment. Étant donné que la structure de la variable element is ne peut pas être entièrement spécifiée dans le schéma. Pour gérer cette variabilité, les éléments du tableau sont transmis sous forme de chaînes.

Dans la description du tableau dePatient, vous pouvez voir l'élément extension décrit commearray<string>, ce qui signifie que vous pouvez accéder aux éléments du tableau à l'aide d'une valeur d'index. Pour accéder aux éléments de la chaîne, vous devez toutefois utiliserjson_extract.

Voici une entrée unique à partir de l'extensionélément trouvé dans le tableau des patients.

[{ "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" } ]

Même s'il s'agit d'un JSON valide, Athena le traite comme une chaîne.

Cet exemple de requête SQL montre comment créer une table contenant les patient-birthPlace éléments patient-mothersMaidenName et. Pour accéder à ces éléments, vous devez utiliser différents indices de tableau et json_extract.

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

Pour en savoir plus sur les requêtes impliquant du JSON, consultez la section Extraction de données depuis JSON dans le guide de l'utilisateur Amazon Athena.

Element: birthDate (Age)

L'âge n'est pas un élément du type de ressource destiné aux patients dans le FHIR. Voici deux exemples de recherches qui filtrent en fonction de l'âge.

L'âge n'étant pas un élément, nous utilisons le birthDate pour les requêtes SQL. Pour voir comment un élément a été ingéré dans FHIR, recherchez le nom de la table sous Tables et vues. Vous pouvez voir qu'il est de type chaîne.

Exemple 1  : calcul d'une valeur pour l'âge

Dans cet exemple de requête SQL, nous utilisons un outil SQL intégré year pour extraire ces composants. current_date Ensuite, nous les soustrayons pour renvoyer l'âge réel du patient sous la forme d'une colonne appeléeage.

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

Exemple 2  : Filtrage pour les patients nés avant 2019-01-01 et qui le sontmale.

La requête SQL vous montre comment utiliser la CAST fonction pour convertir l'birthDateélément en tant que type DATE et comment filtrer en fonction de deux critères définis dans la WHERE clause. Étant donné que l'élément est ingéré sous forme de chaîne de type par défaut, nous devons le CAST faire en tant que typeDATE. Ensuite, vous pouvez utiliser l'<opérateur pour le comparer à une date différente,2019-01-01. En utilisantAND, vous pouvez ajouter un deuxième critère à la WHERE clause.

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

Cet exemple montre les recherches d'emplacements dans le type de ressource Location dont le nom de la ville est 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

La condition de type de ressource stocke les données de diagnostic relatives à des problèmes qui ont atteint un niveau préoccupant. HealthLakeLe traitement du langage naturel (NLP) médical intégré génère de nouvelles Condition ressources en fonction des détails trouvés dans le type de DocumentReference ressource. Lorsque de nouvelles ressources sont générées, HealthLake ajoute la balise SYSTEM_GENERATED à l'metaélément. Cet exemple de requête SQL montre comment effectuer une recherche dans la table de conditions et renvoyer les SYSTEM_GENERATED résultats lorsque ceux-ci ont été supprimés.

Pour en savoir plus sur HealthLake le traitement intégré du langage naturel (NLP), consultezTraitement du langage naturel (NLP) intégré pour HealthLake.

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

Vous pouvez également effectuer une recherche dans un élément de chaîne spécifié pour filtrer davantage votre requête. L'modifierextensionélément contient des informations sur la DocumentReference ressource qui a été utilisée pour générer un ensemble de conditions. Encore une fois, vous devez utiliser json_extract pour accéder aux éléments JSON imbriqués qui sont introduits dans Athena sous forme de chaîne.

Cet exemple de requête SQL montre comment rechercher tout Condition ce qui a été généré en fonction d'un élément spécifiqueDocumentReference. Permet CAST de définir l'élément JSON sous forme de chaîne afin de pouvoir l'utiliser LIKE pour comparer.

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

Le type de ressource Observation stocke les mesures et les assertions simples faites à propos d'un patient, d'un appareil ou d'un autre sujet. HealthLakeLe traitement du langage naturel (NLP) intégré génère de nouvelles Observation ressources en fonction des détails trouvés dans une DocumentReference ressource. Cet exemple de requête SQL inclut des WHERE meta.tag[1] is NULL commentaires, ce qui signifie que les SYSTEM_GENERATED résultats sont inclus.

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

Cette colonne a été importée en tant que struct. Par conséquent, vous pouvez accéder aux éléments qu'il contient en utilisant la notation par points.

Resource type: MedicationStatement

MedicationStatement est un type de ressource FHIR que vous pouvez utiliser pour stocker des informations sur les médicaments qu'un patient a pris, prend ou prendra à l'avenir. HealthLakeLe traitement du langage naturel (NLP) médical intégré génère de nouvelles MedicationStatement ressources en fonction des documents trouvés dans le type de DocumentReference ressource. Lorsque de nouvelles ressources sont générées, HealthLake ajoute la balise SYSTEM_GENERATED à l'metaélément. Cet exemple de requête SQL montre comment créer une requête qui filtre en fonction d'un seul patient en utilisant son identifiant et trouve les ressources qui ont été ajoutées par HealthLake le NLP intégré au logiciel.

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

Pour en savoir plus sur HealthLake le traitement intégré du langage naturel (NLP), consultezTraitement du langage naturel (NLP) intégré pour HealthLake.