2016-07-01 4 views
2

既に提案されているJSONPathオプションを試しましたが、JSONExtractorはルートレベルのみを認識しているようです。私の場合は、配列を持つ入れ子構造のjson-structureを扱わなければなりません(以下の例を参照)。複数の中間ファイルなしでこれを抽出するためのオプション?U-SQL - json-arrayからのデータの抽出

"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 relationid、addressid、street、postcode、city?

+0

修正するにはコードを投稿してください。 – morels

答えて

4

にあなたの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" 
      }] 
     } 
    } 
} 

とファイルにそれを入れ、次のスクリプトは何をしたいあなたを取得します。上位レベルの項目を処理するために構造体を移動する必要があります。アレイに遭遇した場合はCROSS APPLY EXPLODE、アレイがない行が必要な場合はOUTER APPLY EXPLODEが必要です。

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(); 
関連する問題