今天我花了几个小时来解决一个问题,并想分享一下。
我尝试启动之前正在运行的 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
这是唯一使用用户定义函数的字段。经过一番折腾后,我注意到函数编辑器显示函数的标题为:
udf.JsonToString
这是一个外壳问题。我的 UDF 是大写的,而 Azure 流分析希望它是小写的。我将最终字段更改为:
udf.JsonToString(details) AS details
成功了。
奇怪的是,它之前是有效的。 Microsoft 可能对 Azure 流分析进行了更改,使其在以前似乎不区分大小写的地方区分大小写。
不过,这是有道理的。 JavaScript 区分大小写。每个 JavaScript 对象基本上都是一个成员字典。考虑错误:
Stream Analytics job has validation errors: The given key was not present in the dictionary.
“udf”对象有一个字典成员,其中包含我的函数。 UDF 对象将是未定义的。 Undefined 没有我作为成员的功能。
我希望我的 2 小时撞头类(class)能对其他人有所帮助。
关于Azure 流分析 : "Stream Analytics job has validation errors: The given key was not present in the dictionary.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42729164/