U-SQL仅从JSON

时间:2018-04-09 17:02:49

标签: c# json u-sql jsonparser

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

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

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

如果JsonExtractor实际上将JSONPath字符串作为参数,那么无法找到JSON Assembly的文档,但它确实需要一个字符串,而对于其他帖子的读取,它的JSONPath 就像< / em> 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]");

注意:此对象不是真实对象。我的要求是获得阵列的第一个。没有可能匹配的字段

2 个答案:

答案 0 :(得分:2)

找到答案。

当你使用如图所示的文件时,JsonExtract会收到一个字符串参数,它是一个JSONPath,但是,其中第一个元素是一个未命名的数组,它假定每个对象都是不同的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

答案 1 :(得分:0)

如果值'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;