web-dev-qa-db-fra.com

Unnesting in SQL (Athena): Comment convertir un tableau de structures en un tableau de valeurs extraites des structures?

Je prends des échantillons d'un modèle statistique bayésien, les sérialise avec Avro, les télécharge sur S3 et les interroge avec Athena.

J'ai besoin d'aide pour écrire une requête qui déniche un tableau dans la table.

La requête CREATE TABLE ressemble à:

CREATE EXTERNAL TABLE `model_posterior`(
  `job_id` bigint,
  `model_id` bigint,
  `parents` array<struct<`feature_name`:string,`feature_value`:bigint, `is_zid`:boolean>>,
  `posterior_samples` struct <`parameter`:string,`is_scaled`:boolean,`samples`:array<double>>)

Le tableau "samples" dans la colonne "posterior_samples" est l'endroit où les échantillons sont stockés. J'ai réussi à délier la structure "posterior_samples" avec la requête suivante:

WITH samples AS (
    SELECT model_id, parents, sample, sample_index
    FROM posterior_db.model_posterior 
    CROSS JOIN UNNEST(posterior_samples.samples) WITH ORDINALITY AS t (sample, sample_index)
    WHERE job_id = 111000020709
)
SELECT * FROM samples

enter image description here

Maintenant, ce que je veux, c'est dénouer la colonne des parents. Chaque enregistrement de cette colonne est un tableau de structures. J'essaye de créer une colonne qui a juste un tableau de valeurs pour les clés "feature_value" dans ce tableau de structures. (La raison pour laquelle je veux un tableau est que le tableau des parents peut avoir une longueur> 1).

En d'autres termes, pour chaque tableau de la ligne des parents, je veux un tableau de la même taille. Ce tableau ne doit contenir que les valeurs de la clé "feature_value" des structures du tableau d'origine.

Des conseils sur la façon de résoudre ce problème?

Merci.

10
Count Zero

Vous pouvez utiliser la fonction transform décrite ici . En supposant que nous ayons une table nommée samples avec la structure mentionnée dans votre question. Ensuite, vous pouvez écrire une requête qui ressemble à ceci:

SELECT *, transform(parents, parent -> parent.feature_value) as only_ feature_values

FROM samples

Remarque: ce nombre n'est pas la requête parfaite syntaxiquement mais vous pouvez jouer avec.

J'espère que cela vous aidera. À votre santé :)

6
Dhaval