2016-03-10 2 views
6

J'essayais d'extraire des données d'un fichier JSON en utilisant USQL. Soit la requête s'exécute avec succès sans produire de données de sortie, soit aboutit à une erreur "vertex failed fast error".U-SQL Impossible d'extraire les données du fichier JSON

Le fichier JSON ressemble:

{ 
    "results": [ 
    { 
     "name": "Sales/Account", 
     "id": "7367e3f2-e1a5-11e5-80e8-0933ecd4cd8c", 
     "deviceName": "HP", 
     "deviceModel": "g6-pavilion", 
     "clientip": "0.41.4.1" 
    }, 
    { 
     "name": "Sales/Account", 
     "id": "c01efba0-e0d5-11e5-ae20-af6dc1f2c036", 
     "deviceName": "acer", 
     "deviceModel": "veriton", 
     "clientip": "10.10.14.36" 
    } 
    ] 
} 

Et mon script U-SQL est

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

DECLARE @in string="adl://xyz.azuredatalakestore.net/todelete.json"; 

DECLARE @out string="adl://xyz.azuredatalakestore.net/todelete.tsv"; 

@trail2=EXTRACT results string FROM @in USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor(); 

@jsonify=SELECT Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(results,"name","id","deviceName","deviceModel","clientip") AS rec FROM @trail2; 

@logSchema=SELECT rec["name"] AS sysName, 
       rec["id"] AS sysId, 
       rec["deviceName"] AS domainDeviceName, 
       rec["deviceModel"] AS domainDeviceModel, 
       rec["clientip"] AS domainClientIp 
     FROM @jsonify; 

OUTPUT @logSchema TO @out USING Outputters.Tsv(); 

Répondre

8

En fait, le JSONExtractor prend en charge le paramètre rowpath exprimé en JSONPath que vous donne la possibilité d'identifier les éléments objet JSON ou tableau JSON que vous souhaitez mapper en lignes. Vous pouvez donc extraire vos données avec une seule instruction de votre document JSON:

@logSchema = 
    EXTRACT name string, id string, deviceName string, deviceModel string, clientip string 
    FROM @input 
    USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor("results[*]"); 
0

Sarath,

le problème est que votre sortie @ de trail2 était un tableau JSON " [{...}, {...}] "que JsonFunction ne peut pas analyser, autant que je sache. J'ai donc sorti cela dans un fichier et je l'ai relu avec l'entrée, qui peut analyser les tableaux.

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

DECLARE @in string="adl://xyz.azuredatalakestore.net/todelete.json"; 
DECLARE @out string="adl://xyz.azuredatalakestore.net/todelete.tsv"; 
DECLARE @mid string="adl://xyz.azuredatalakestore.net/intermediate.txt"; 


@trail2=EXTRACT results string FROM @in USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor(); 

OUTPUT @trail2 TO @mid USING Outputters.Text(quoting:false); 

@jsonify=EXTRACT name string, 
       id string, 
       deviceName string , 
       deviceModel string, 
       clientip string 
FROM @mid USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor(); 

@logSchema=SELECT name AS sysName, 
       id AS sysId, 
       deviceName AS domainDeviceName, 
       deviceModel AS domainDeviceModel, 
       clientip AS domainClientIp 
     FROM @jsonify; 

OUTPUT @logSchema TO @out USING Outputters.Tsv(); 
+0

Merci Michael, qui a résolu le problème. –

+0

Vous pouvez le faire plus efficacement sans fichiers intermédiaires (qui nécessitent en fait de soumettre deux tâches car les scripts ne peuvent pas lire les données qu'il crée). Voir ma réponse alternative. –