Azure 流分析:"Stream Analytics job has validation errors: The given key was not present in the dictionary."

Azure Stream Analytics: "Stream Analytics job has validation errors: The given key was not present in the dictionary."

我今天在一个问题上花了几个小时,我想我会分享。

我试图启动一个以前工作的 Azure 流分析作业,但很快就失败了:

Failed to start Streaming Job 'shayward10ProcessLogs'.

我查看了 JSON 日志,但没有找到任何有用的信息。问题的唯一描述是:

Stream Analytics job has validation errors: The given key was not present in the dictionary.

鉴于错误和对我们数据库的一些更改,我尝试了以下方法但没有效果:

我的查询如下:

SELECT
    dateTimeUtc,
    context.tenantId AS tenantId,
    context.userId AS userId,
    context.deviceId AS deviceId,
    changeType,
    dataType,
    changeStatus,
    failureReason,
    ipAddress, 
    UDF.JsonToString(details) AS details
INTO
    [MyOutput]
FROM
    [MyInput]
WHERE
    logType = 'MyLogType';

没有任何意义所以我开始解构我的查询。我把它归结为一个领域,它成功了。我逐个字段地查看,试图找出是哪个字段(如果有的话)引起的。

请参阅下面的回答。

答案很简单(但令人沮丧)。当我到达最后一个字段时,那是失败的地方:

UDF.JsonToString(details) AS details

这是唯一使用 user-defined 函数的字段。转了一圈之后,我注意到函数编辑器将函数的标题显示为:

udf.JsonToString

这是一个大小写问题。我的 UDF 是大写的,而 Azure 流分析期望它是小写的。我将最终字段更改为:

udf.JsonToString(details) AS details

成功了。

奇怪的是,它以前是有效的。 Microsoft 可能对 Azure 流分析进行了更改,使其 case-sensitive 出现在以前似乎没有的地方。

不过,这是有道理的。 JavaScript 是 case-sensitive。每个 JavaScript object 基本上都是一个成员字典。考虑错误:

Stream Analytics job has validation errors: The given key was not present in the dictionary.

"udf" object 有一个字典成员,里面有我的函数。 UDF object 将是未定义的。 undefined 没有我作为成员的函数。

我希望我的 2 小时 head-banging session 能帮助到其他人。