2016-09-13 115 views
0

如何在一行中顯示每個JSON數組元素爲逗號分隔元件,而不是每行一個元件,以U-SQL?顯示JSON數組元素作爲一行以U-SQL

例如,JSON文件是:

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

結果,所有的數組元素每行打印一個,即所有D1到D7元素都在不同的行上。我想要的D1至D7的元件是相同的線的一部分,因爲它是JSON對象的一部分。

是:

1,2,3,4,5,6,7

如何可以這樣做?

回答

0

最重要的部分是,C1數組包含每D我一個項目。所以如果你把它當作每行的項目,你會得到不同的行。在這種情況下,你想對所有的C1一行。

下做到這一點有兩種方式:一是時間,你知道是什麼局及部門,一個時間,如果你不知道,仍然希望他們在一排(現在都在一個單元)。

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表達式,然後它使用在所得到的地圖作爲鍵找到的所有路徑。