2017-03-03 1 views
0

Je veux fondamentalement obtenir toutes les clés dans les "questions" et faire des enregistrements individuels pour chaque clé. Dire que j'ai données JSON qui ressemble à ceci:Y at-il un moyen de faire une clé json un champ dans redshift

"result": { 
    "id": "dsgdsg", 
    "name": "xxx", 
    "expiration": { 
     "startDate": null, 
     "endDate": null 
    }, 
    "questions": { 
     "QID4": { 
      "questionType": { 
       "selector": "TB", 
       "subSelector": null 
      }, 
      "questionLabel": null, 
      "validation": { 
       "doesForceResponse": false 
      } 
     }, 
     "QID5": { 
      "questionType": { 
       "selector": "ML", 
       "subSelector": null 
      }, 
      "questionLabel": null, 
      "validation": { 
       "doesForceResponse": false 
      } 
     }, 
     "QID6": { 
      "questionType": { 
       "selector": "SAVR", 
       "subSelector": "TX" 
      }, 
      "questionLabel": null, 
      "validation": { 
       "doesForceResponse": false 
      } 

     }, 
     "QID7": { 
      "questionType": { 
       "selector": "SAVR", 
       "subSelector": "TX" 
      }, 
      "questionLabel": null, 
      "validation": { 
       "doesForceResponse": false 
      } 

     } 

    } 
    } 

aurait-il moyen en utilisant jsonpaths pour charger individuellement chaque QID dans son propre champ avec son propre record? J'ai essayé quelque chose sur les lignes de ceci:

{ 
"jsonpaths": [ 
    "$.result.id", 
    "$.result.name", 
    "$.result.questions.[0]" 
] 
} 

mais cela donne seulement les données dans QID4 et ainsi de suite. Pourrais-je en quelque sorte boucler les jsonpaths?

+0

Y a-t-il un nombre fixe de questions dans chaque résultat ... c.-à-d. tous les résultats ont des questions 4-7? – systemjack

+0

Non, c'est mon problème principal chaque résultat a un nombre différent de questions donc je ne peux pas donner un nombre concret min et max. –

+0

Ce que j'essaie de faire maintenant est essentiellement d'utiliser python pour obtenir tous les qids et créer un nouveau champ dans le qid qui contient cette clé. –

Répondre

0

Il serait préférable que vous puissiez le modifier du côté Python pour que chaque enregistrement JSON soit une question avec les informations de résultat incluses dans chacun si nécessaire. Avec jsonpaths, le fichier de données n'est pas réellement JSON valide. Il est composé de blobs JSON séparés, un pour chaque enregistrement.

Un exemple de deux de ces enregistrements en fonction de vos données serait:

{ 
    "qid" : "QID4", "result_id" : "dsgdsg", "result_name": "xxx", 
    "result_expiration": { "result_startDate": null, "result_endDate": null }, 
    "questionType": { "selector": "TB", "subSelector": null }, 
    "questionLabel": null, 
    "validation": { "doesForceResponse": false } 
} 
{ 
    "qid" : "QID5", "result_id" : "dsgdsg", "result_name": "xxx", 
    "result_expiration": { "result_startDate": null, "result_endDate": null }, 
    "questionType": { "selector": "ML", "subSelector": null }, 
    "questionLabel": null, 
    "validation": { "doesForceResponse": false } 
} 

Notez qu'il n'y a pas de virgule entre les deux dossiers.

Alors jsonpaths serait comme:

{ 
"jsonpaths": [ 
    "$.qid", 
    "$.result_name", 
    "$.result_expiration.result_startDate", 
    ... 
] 
} 

Si ce n'est pas possible il peut y avoir une approche où l'on pouvait charger l'ensemble de l'élément « $ .result.questions » dans un champ dans une mise en scène/table temporaire comme JSON et le manipuler avec Redshift JSON functions dans un tableau final.

+0

Merci pour la réponse. Je pense que le premier exemple pourrait ne pas être possible. J'ai déjà chargé les questions dans une colonne dans redshift, je vais regarder dans les fonctions redshift json que vous avez fournies. Merci pour votre aide! –

+0

En fait pensez-vous que je pourrais passer par les données en python et créer un nouveau champ comme ceci par exemple: "questions": { "QID4": { "questionType": { "selector": "TB" , "subSelector": null }, "qid": QID4, "questionLabel": null, "validation": { "doesForceResponse": false } où je joins que qID 4 dans l'ensemble actuel de question ? –

+0

Je pense que je vois où tu vas avec ça. Cela pourrait fonctionner si chaque enregistrement dans le JSON est l'une des questions. Vous avez juste besoin du "QUID4" en tant que valeur au lieu d'un nom de clé afin qu'il puisse entrer dans une colonne de table. Vous n'avez besoin d'aucune des données d'en-tête de résultat? – systemjack