2016-09-13 8 views
0

各JSON配列要素をU-SQLの1行に1つの要素ではなく、1行にカンマ区切り要素として表示するにはどうすればよいですか?例えば、JSONファイルはU-SQLのJSON配列要素を1行で表示

ある:

{ 
    "A": { 
     "A1": "1", 
     "A2": 0 
    }, 
    "B": { 
     "B1": "1", 
     "B2": 0 
    }, 
    "C": { 
     "C1": [ 
       { 
        "D1": "1" 
       }, 
       { 
        "D2": "2" 
       }, 
       { 
        "D3": "3" 
       }, 
       { 
        "D4": "4" 
       }, 
       { 
        "D5": "5" 
       }, 
       { 
        "D6": "6" 
       }, 
       { 
        "D7": "7" 
       } 
     ] 
    } 

}

次のように配列C1、この断片を処理するためのコードである:

@sql = SELECT 
     Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(C)["C1"] AS C1_array 

     FROM @json; 

OUTPUT @sql TO "test.txt" USING Outputters.Csv(quoting: false); 

@sql2 = SELECT  
     Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(C1_array) AS C1 
FROM @sql 
    CROSS APPLY 
    EXPLODE (Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(C1_array).Values) AS D(C1); 


@result = 
     SELECT C1["D1"]AS D1, 
     C1["D2"] AS D2, 
     C1["D3"]AS D3, 
     C1["D4"]AS D4, 
     C1["D5"]AS D5, 
     C1["D6"]AS D6, 
     C1["D7"]AS D7, 

FROM @sql2; 


OUTPUT @result TO "output.txt" USING Outputters.Text(); 

すべての結果配列要素は1行に1つずつ印刷されます。つまり、すべてのD1〜D7要素は別々の行にあります。私はD1からD7までの要素がJSONオブジェクトの一部であるので、同じ行の一部にしたいと思います。

ある:

1、2、3、4、5、6、7

どのようにこれを行うことができますか?

答えて

0

C1の配列には、D 1つの項目が含まれていることが重要です。したがって、行ごとの項目として扱うと、別々の行が表示されます。この場合、C1のすべてに対して1つの行が必要です。

これは次の2つの方法で行います:1回はDsの内容を知っていますが、1つの行には分かりません。あなたが見ることができるように

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

// Get one row per C and get the C1 array as column 
@d = EXTRACT C1 string FROM "/Temp/ABCD.txt" USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor("C"); 

// Keep one row per C and get all the items from within the C1 array 
@d = 
    SELECT Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple(C1, "[*].*") AS DMap 
    FROM @d; 

// Get individual items 
@d1 = 
    SELECT 
     DMap["[0].D1"] AS D1, 
     DMap["[1].D2"] AS D2, 
     DMap["[2].D3"] AS D3, 
     DMap["[3].D4"] AS D4, 
     DMap["[4].D5"] AS D5, 
     DMap["[5].D6"] AS D6, 
     DMap["[6].D7"] AS D7 
    FROM @d; 

// Keep it generic and get all item in a single column 
@d2 = 
    SELECT String.Join("\t", DMap.Values) AS Ds 
    FROM @d; 

OUTPUT @d1 
TO "/Temp/D-Out1.tsv" 
USING Outputters.Tsv(); 

OUTPUT @d2 
TO "/Temp/D-Out2.tsv" 
USING Outputters.Tsv(quoting:false); 

JsonTuple機能はJSONPath式を取ることができ、それがキーとして結果のマップで見つかったすべてのパスを使用しています。

関連する問題