在U-SQL作业中使用Json.NET库无法实现JSONPath条件选择求助
解决U-SQL中提取JSON数组指定元素的问题
我来帮你搞定这个问题!你遇到的核心问题是:U-SQL的JsonTuple并不支持JSONPath的数组过滤语法(也就是你写的[?(@.NameType == 'FULL_NAME')]这种表达式),所以你的查询没法正确解析Name数组里的匹配项,最终返回了默认的"NotFound"。
下面是针对你的场景修改后的可行代码,我会一步步解释逻辑:
REFERENCE ASSEMBLY JSONBlog.[Newtonsoft.Json]; REFERENCE ASSEMBLY JSONBlog.[Microsoft.Analytics.Samples.Formats]; USING Microsoft.Analytics.Samples.Formats.Json; DECLARE @inputpath string = "/Samples/PCISData/BC__DE_20170920113743_18.json"; DECLARE @outputfile string = "/Samples/StandardizedData/Output2.csv"; @RawData = EXTRACT [Person] string, filename string FROM @inputpath USING new JsonExtractor(); -- 1. 提取Person的基础字段,同时把Name数组作为字符串单独提取出来 @PersonWithNames = SELECT JsonFunctions.JsonTuple([Person], "PersonType", "PersonIdentification.IdentificationId", "Name") AS PersonData FROM @RawData; -- 2. 把Name数组拆分成单个元素,同时解析每个元素的NameType和NameValue @ExplodedNames = SELECT PersonData["PersonType"] AS PersonType, PersonData["PersonIdentification.IdentificationId"] AS PersonIdentification, JsonFunctions.JsonTuple(name) AS NameItem FROM @PersonWithNames -- 先把数组字符串转成可遍历的数组,再拆分成单行 CROSS APPLY EXPLODE(JsonFunctions.JsonArrayParse(PersonData["Name"])) AS Names(name); -- 3. 筛选并获取FULL_NAME对应的NameValue,没有则返回NotFound @FinalData = SELECT PersonType, PersonIdentification, -- 用聚合函数获取匹配项,没有的话用??返回默认值 MAX(CASE WHEN NameItem["NameType"] == "FULL_NAME" THEN NameItem["NameValue"] ELSE NULL END) ?? "NotFound" AS FullName FROM @ExplodedNames GROUP BY PersonType, PersonIdentification; OUTPUT @FinalData TO @outputfile USING Outputters.Csv(outputHeader:true, quoting:true);
代码逻辑说明:
- 提取基础字段与数组:第一步先把Person的核心字段(PersonType、PersonIdentification)和Name数组字符串提取出来,方便后续处理。
- 拆分数组元素:用
JsonArrayParse把Name数组的字符串转成U-SQL可识别的数组,再通过CROSS APPLY EXPLODE把数组里的每个元素拆分成单独的行,同时用JsonTuple解析每个元素的结构。 - 筛选并聚合结果:用
CASE WHEN判断每个元素的NameType是否为"FULL_NAME",再通过MAX聚合(确保只取到匹配的那一个值),如果没有匹配项则用??运算符返回"NotFound"。
这样修改后,就能正确提取到你需要的Rosemarie Algermissen这个全名了。
内容的提问来源于stack exchange,提问作者saad0n87
相关产品推荐
相关产品推荐

