2016-07-01 3 views
2

déjà essayé l'option JSONPath suggéré, mais il semble que le JSONExtractor ne reconnaît que le niveau de la racine. Dans mon cas, je dois traiter avec une structure json imbriquée, avec un tableau aussi (voir l'exemple ci-dessous). Des options pour extraire cela sans plusieurs fichiers intermédiaires?U-SQL - Extraire des données de JSON-gamme

"relation": { 
"relationid": "123456", 
"name": "relation1", 
"addresses": { 
    "address": [{ 
     "addressid": "1", 
     "street": "Street 1", 
     "postcode": "1234 AB", 
     "city": "City 1" 
     }, 
    { 
     "addressid": "2", 
     "street": "Street 2", 
     "postcode": "5678 CD", 
     "city": "City 2" 
    }] 
}} 

SELECT relation, adresse, rue, code postal, ville?

+0

veuillez poster votre code essayer afin d'être fixé. – morels

Répondre

4

Après avoir fixé votre fragment JSON:

{ 
    "relation": { 
     "relationid": "123456", 
     "name": "relation1", 
     "addresses": { 
      "address": [{ 
       "addressid": "1", 
       "street": "Street 1", 
       "postcode": "1234 AB", 
       "city": "City 1" 
      }, { 
       "addressid": "2", 
       "street": "Street 2", 
       "postcode": "5678 CD", 
       "city": "City 2" 
      }] 
     } 
    } 
} 

et de le mettre dans un fichier, le script suivant vous obtiendrez ce que vous voulez. Notez que vous devez naviguer dans la structure pour transporter les éléments de niveau supérieur et une fois que vous rencontrez un tableau, vous en aurez besoin si vous avez seulement besoin de ceux qui ont le tableau, ou EXTERSEZ l'EXPLODEZ si vous voulez des lignes avec des tableaux manquants.

DECLARE @input string = @"/temp/stackoverflow.json"; 

REFERENCE ASSEMBLY [Newtonsoft.Json]; 
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats]; 

@json = 
EXTRACT relationid int, 
     name string, 
     addresses string 
    FROM @input 
USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor("relation"); 

@relation = 
SELECT relationid, 
     name, 
     Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(addresses)["address"] AS address_array 
FROM @json; 

@addresses = 
SELECT relationid, 
     name, 
     Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(address) AS address 
FROM @relation 
    CROSS APPLY 
     EXPLODE (Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(address_array).Values) AS A(address); 

@result = 
SELECT relationid, 
     name, 
     address["addressid"]AS addressid, 
     address["street"]AS street, 
     address["postcode"]AS postcode, 
     address["city"]AS city 
FROM @addresses; 

OUTPUT @result 
TO "https://stackoverflow.com/users/temp/st_out.csv" 
USING Outputters.Csv();