2
votes

Redshift Spectrum: structure de tableau JSON anonyme de requête

J'ai un tableau JSON de structures dans S3, qui est correctement analysé et catalogué par Glue.

$[*] 

J'utilise le classificateur personnalisé:

[{"key":"value"}, {"key":"value"}]


2 commentaires

C'est encore un problème jusqu'à ce jour. Avez-vous trouvé autre chose que ce que vous avez mentionné dans la réponse?


@HasanJ Toutes les implémentations que j'ai faites depuis ce post, nous avons choisi d'utiliser un seul enregistrement par ligne, plutôt qu'un tableau [anonyme] ... Donc je ne sais pas s'il existe une solution viable ou non.


4 Réponses :


2
votes

Nommer le tableau dans le fichier JSON comme ceci:

{"key":"value"}
{"key":"value"}
etc.

Et mettre à jour le classificateur:

$.values[*]

Résout le problème ... Intéressé de savoir s'il existe un moyen d'interroger des tableaux anonymes. Il semble assez courant de stocker des données comme ça.

Mise à jour: En fin de compte, cette solution n'a pas fonctionné, car Spectrum ne retournerait jamais aucun résultat. Il n'y a eu aucune erreur, juste aucun résultat, et pour l'instant toujours pas de solution autre que l'utilisation d'enregistrements individuels par ligne:

"values":[{"key":"value"},...}

Cela semble être un problème spécifique à Spectrum, car Athena fonctionnerait toujours.

Je voudrais savoir si quelqu'un d'autre a pu le faire fonctionner ...


0 commentaires

0
votes

Si la structure de votre table est la suivante:

SELECT c.id, o.key, o.value FROM   spectrum.testjson c, c.columnName o;

vous pouvez utiliser la requête suivante pour accéder à l'élément du tableau:

CREATE EXTERNAL TABLE spectrum.testjson(struct<id:varchar(25), 
columnName<array<struct<key:varchar(20),value:varchar(20)>>>);

Pour Pour plus d'informations, vous pouvez consulter la documentation AWS:

https://docs.aws.amazon.com/redshift/latest/dg/tutorial-query-nested-data-sqlextensions.html


0 commentaires

1
votes

Vous pouvez utiliser json_extract_path_text pour extraire l'élément ou json_extract_array_element_text ('json string', pos [ null_if_invalid]).

par exemple: pour le 2ème élément d'index sélectionnez json_extract_array_element_text ('[111,112,113]', 2);

résultat: 113


0 commentaires

0
votes

J'ai réussi cela, mais sans classificateur de données. Mon fichier JSON ressemble à:

select o.partition_0, o.col1, o.col2, t.col4
from db.tablename o
LEFT JOIN o.col3 t on true;

J'ai commencé avec un robot d'exploration pour obtenir une définition de table de base. IMPORTANT: les options de configuration du robot sous Sortie NE PEUVENT PAS être définies sur Mettre à jour la définition de la table ..., sinon la réexécution ultérieure du robot remplacera les modifications manuelles décrites ci-dessous. J'ai utilisé Ajouter de nouvelles colonnes uniquement.

J'ai dû ajouter la propriété 'strip.outer.array' ET ajouter manuellement les colonnes les plus hautes dans mon tableau anonyme. Le schéma d'origine de l'exécution initiale du robot d'exploration était:

col1:string
col2:string
col3:array<struct<col4...>>
partition_0 string

J'ai mis à jour manuellement mon schéma en:

anon_array array<struct<col1:string,col2:string,col3:array<struct<col4...>>>
partition_0 string

(Et aussi ajoutez le paramètre serde strip.outer.array.)

Ensuite, j'ai dû réexécuter mon robot d'exploration, et enfin j'ai pu interroger dans Spectrum comme:

[
    {
        "col1": "data_from_col1",
        "col2": "data_from_col2",
        "col3": [
            {
                "col4": "data_from_col4",
                ...
            {
        ]
    },
    {
        "col1": "data_from_col1",
        "col2": "data_from_col2",
        "col3": [
            {
                "col4": "data_from_col4",
                ...
            {
        ]
    },
    ...
]

p >


3 commentaires

@HassanJ Je me demande si ma réponse fonctionnerait pour vous et pour @ comfytoday


C'est une solution intéressante. Je n'ai pas vu le paramètre strip.out.array. Quelles sont les 2 premières colonnes du schéma? Pouvez-vous mettre un exemple du JSON dans votre réponse, juste pour que votre fichier ressemble à quoi? Merci d'avoir répondu!


J'ai ajouté un exemple JSON. J'ai déjà le schéma ci-dessus - ce que le robot d'exploration d'origine a proposé et comment j'ai dû le modifier manuellement pour le faire fonctionner avec le paramètre strip.outer.array. Faites-moi savoir si quelque chose n'est toujours pas clair.