问题描述
Azure Stream Analytics(ASA)将数据输出到下游并转换为CSV时,某些 JSON 字段(如 message)被自动转换成 Record 类型,导致原本期望的 JSON 字符串无法正常展示或被下游系统解析。
问题解答
出现该问题的主要原因是:ASA 在处理 JSON 对象时,如果输入字段是 JSON 对象(object 类型)而非 JSON 字符串,会在输出为 CSV 时默认序列化成 Record。
解答疑惑:为什么 JSON 字段会变成 Record
- ASA 对输入字段进行类型推断:
- **字符串** → 正常写入 CSV
- 对象(Object) → 默认序列化为
Record
- 当上游消息从“JSON 字符串”变成“JSON 对象”时,ASA 识别到的是结构化对象,因此在输出到 CSV 时自动以 Record 的方式呈现。
- 对象(Object) → 默认序列化为
- 因此需主动将 JSON 对象转换为字符串,最简方式是使用 JavaScript UDF。
解决步骤
第一步:创建 JavaScript UDF
打开 ASA Job → 点击 Functions(函数)
选择 Add Function → JavaScript UDF
填写函数名称(如
jsonstringify)在编辑器中填写 JavaScript 代码
function main(x) {
return JSON.stringify(x);
}
- 保存函数
第二步:在 ASA 查询中调用 UDF
在 ASA 查询内,对目标字段使用 UDF,例如:
SELECT
UDF.jsonstringify(input.message) AS message,
*
INTO output
保存查询并启动作业后,JSON 对象将被转换成字符串并成功写入 CSV。
参考资料
JavaScript user-defined functions in Azure Stream Analytics : https://learn.microsoft.com/en-us/azure/stream-analytics/stream-analytics-javascript-user-defined-functions#other-javascript-user-defined-function-patterns
正在加载评论...