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
我有一个 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