2016-09-13 7 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" 
       } 
     ] 
    } 

}

код для обработки этого фрагмента для массива С1 выглядит следующим образом:

@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 i. Поэтому, если вы рассматриваете его как элемент в строке, вы получите отдельные строки. В этом случае вам нужна одна строка для всех C1.

Следующее делает это двумя способами: однажды вы знаете, что такое Ds, и один раз, если вы не знаете и все еще хотите, чтобы они были в одной строке (теперь все в одной ячейке).

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, а затем он использует все найденные пути в результате карты в качестве ключей.