Interrogation de 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.

Interrogation de HealthLake données avec SQL

Lorsque vous importez vos données FHIR dans le magasin de HealthLake données, les données FHIR JSON imbriquées sont simultanément soumises à 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 table, dans laquelle il peut être interrogé à l'aide d'Amazon Athena. Les tables peuvent être interrogées individuellement ou en groupe à l'aide de requêtes SQL. En raison de la structure des magasins de données, vos données sont importées dans Athena sous la forme de plusieurs types de données différents. Pour en savoir plus sur la création de requêtes SQL pouvant accéder à ces types de données, consultez la section Tableaux de requêtes dotés de types complexes et de structures imbriquées dans le guide de l'utilisateur d'Amazon Athena.

Note

Tous les exemples présentés dans 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 du champ Type de ressource : Patient.

  • Elé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 savoir comment un type de ressource a été ingéré, recherchez-le sous 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 savoir comment un type de ressource a été ingéré, recherchez-le sous 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 au JSON et la recherche dans celui-ci, consultez la section Interrogation de 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 les requêtes, fonctions et opérateurs DML dans le guide de l'utilisateur d'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 d'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 d'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 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 en utilisant une valeur d'index. Pour accéder aux éléments de la chaîne, vous devez toutefois utiliserjson_extract.

Voici une seule entrée 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 à partir de JSON dans le guide de l'utilisateur Amazon Athena.

Element: birthDate (Age)

L'âge n'est pas un élément du type de ressource patient dans le FHIR. Voici deux exemples de recherches filtrées en fonction de l'âge.

Comme l'âge n'est 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 ceux qui le sontmale.

La requête SQL vous montre comment utiliser la CAST fonction pour convertir l'birthDateélément en type DATE et comment filtrer en fonction des deux critères de la WHERE clause. Étant donné que l'élément est ingéré en tant que chaîne de caractères par défaut, nous devons l'CASTingérer en tant que typeDATE. Ensuite, vous pouvez utiliser l'<opérateur pour le comparer à une autre date,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 de lieux dans le type de ressource Location dont le nom de 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 du type de ressource stocke les données de diagnostic relatives à des problèmes devenus préoccupants. HealthLakele traitement médical intégré du langage naturel (NLP) 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 des conditions et renvoyer des résultats lorsque les SYSTEM_GENERATED résultats ont été supprimés.

Pour en savoir plus sur HealthLake le traitement automatique du langage naturel (NLP) intégré, 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écifique pour filtrer davantage votre requête. L'modifierextensionélément contient des détails 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 vous pouvez rechercher tout Condition ce qui a été généré en fonction d'un élément spécifiqueDocumentReference. CASTÀ utiliser pour 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 médical intégré du langage naturel (NLP) génère de nouvelles MedicationStatement ressources sur la base 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 filtrant en fonction d'un seul patient à l'aide de son identifiant et recherchant les ressources ajoutées par HealthLake le NLP intégré.

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 automatique du langage naturel (NLP) intégré, consultezTraitement du langage naturel (NLP) intégré pour HealthLake.