You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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);

代码逻辑说明:

  1. 提取基础字段与数组:第一步先把Person的核心字段(PersonType、PersonIdentification)和Name数组字符串提取出来,方便后续处理。
  2. 拆分数组元素:用JsonArrayParse把Name数组的字符串转成U-SQL可识别的数组,再通过CROSS APPLY EXPLODE把数组里的每个元素拆分成单独的行,同时用JsonTuple解析每个元素的结构。
  3. 筛选并聚合结果:用CASE WHEN判断每个元素的NameType是否为"FULL_NAME",再通过MAX聚合(确保只取到匹配的那一个值),如果没有匹配项则用??运算符返回"NotFound"。

这样修改后,就能正确提取到你需要的Rosemarie Algermissen这个全名了。

内容的提问来源于stack exchange,提问作者saad0n87

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:12:37