0

如何在 U-SQL 中将每个 JSON 数组元素显示为一行中的逗号分隔元素,而不是每行一个元素?

例如,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

如何才能做到这一点?

4

1 回答 1

0

重要的部分是C1数组每个Di 包含一个项目。因此,如果您将其视为每行的一个项目,您将获得单独的行。在这种情况下,您希望所有C1.

以下以两种方式做到这一点:一次您知道 D 是什么,一次如果您不知道并且仍然希望它们在一行中(现在都在一个单元格中)。

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 表达式,然后使用结果映射中所有找到的路径作为键。

于 2016-10-10T20:15:47.703 回答