2016-09-13 116 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表达式,然后它使用在所得到的地图作为键找到的所有路径。