U-SQL 仅从 JSON 中提取特定数据

U-SQL ONLY extract specific data from JSON

我有一个 JSON 文件,其中包含一个对象数组

{
  [ 
    {id:1, a:4},
    {id:2, a:7},
    {id:3, a:5},
    {id:4, a:9}
  ]    
}

如何编写 U-SQL 脚本来仅提取第一个对象 {id:1, a:4}

如果 JsonExtractor 实际上将 JSON 路径字符串作为参数,则无法在 JSON 程序集的文档中找到它,但它确实需要一个字符串以及在其他帖子中阅读的内容,它是一个 JSONPath like string

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

USING Microsoft.Analytics.Samples.Formats.Json;

DECLARE @InputPath string = "filepath.json"

@RawData = 
    EXTRACT id     int,
            a      int
    FROM @InputPath
    USING new JsonExtractor("$[:1]");

注意:此对象不是真实对象。我的要求是获得数组的第一个。无法匹配字段

如果值 'id' 始终是从 1 开始的顺序,您可以使用 WHERE 子句:

@RawData = 
    EXTRACT id     int,
            a      int
    FROM @InputPath
    USING new USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor();

@CleanData
    SELECT  id    int,
            a     int
    FROM @RawData
    WHERE id == 1;

找到答案。

事实证明,JsonExtract 确实收到了一个字符串参数,它是一个 JSONPath,but 当您使用如图所示的文件时,其中第一个元素是未命名的数组,它假定每个对象都是不同的 JSON.

在这里您可以找到说明问题的issue


据我所知,你有 2 条出路:

实现您自己的提取器来处理这种情况。

如果可以的话,重建你的输入JSON,以便命名数组。

{
  data: [ 
    {id:1, a:4},
    {id:2, a:7},
    {id:3, a:5},
    {id:4, a:9},
  ]
}

然后你可以使用 JsonPath 来提取 json 的特定部分,就像这样

@RawData = 
  EXTRACT id     int,
          a      int
  FROM @InputPath
  USING new JsonExtractor("$.data[0]");

得到结果id: 1, a:4