2016-03-10 19 views
6

USQLを使用してJSONファイルからデータを抽出しようとしました。クエリは、出力データを生成せずに正常に実行されるか、「頂点には失敗した高速エラー」が発生します。U-SQL JSONファイルからデータを抽出できません

JSONファイルは次のようになります。

{ 
    "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" 
    } 
    ] 
} 

そして、私のU-SQLスクリプトは問題があなたの@ trail2出力はJSON配列」ということだった

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(); 

答えて

8

実際JSONExtractorはあなたにJSONオブジェクトまたはあなたが列にマップするJSON配列の項目を識別することができますJSONPathで表現rowpathパラメータをサポートしています。したがって、JSONドキュメントの1つのステートメントでデータを抽出することができます。

@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、

です[{...}、{...}] "JsonFunctionは解析できませんが、私が知る限りです。そこでファイルに出力し、配列を解析できるinputterで読み直しました。

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

マイケルに問題が解決したことを感謝します。 –

+0

中間ファイル(スクリプトが作成したデータを読み取ることができないため、実際には2つのジョブを提出する必要があります)を使用しない方が効率的です。私の代わりの答えを見てください。 –