Azure流分析删时间列重建仍报OutputDataConversionError.TypeConversionError
问题原因排查
首先不存在你所说的无法手动清理的隐藏缓存,该OutputDataConversionError.TypeConversionError报错本质是Azure Stream Analytics(ASA)的查询输出字段,和Azure Synapse专用SQL池目标表的字段定义不匹配,报错重复出现的常见原因如下:
- 字段匹配规则踩坑:ASA输出到Synapse专用SQL池时按字段顺序匹配,而非按字段名匹配,你删除
time列后,需要同时确认新的SELECT语句输出的字段顺序、每个字段的类型/长度/非空属性,和修改后的Synapse表的字段顺序、定义完全一致,只要有一个位置的字段类型不匹配就会触发该报错。 - 查询笔误导致值异常:你当前的查询语句存在明显笔误,
Records.ArrayValue.minimum as [maximum]一行重复读取了minimum字段的值,如果Synapse表中maximum字段的定义和实际输出值的类型不匹配也会触发转换错误。 - 非datetime字段的类型不匹配:除了已删除的time列之外,其他字段也可能存在类型不匹配问题:比如从Event Hub读取的JSON数值字段实际是字符串格式(比如
"count":"123"),但Synapse表对应字段设为int;或者字符串字段的内容超出了Synapse表varchar/nvarchar的定义长度;或者不允许为空的字段收到了null值。 - Event Hub残留脏数据:重建ASA作业时如果默认选择从最早的事件开始处理,Event Hub中之前存在的异常脏数据会被重复读取,导致报错反复出现,并非缓存问题。
解决步骤
- 先修复查询笔误,将maximum字段的取值改为
Records.ArrayValue.maximum as [maximum]。 - 临时将ASA作业的输出切换为Blob存储,运行一段时间后导出输出数据,逐一核对每个字段的类型、取值范围是否符合Synapse表的定义。
- 对所有字段增加显式容错类型转换:用
TRY_CAST代替直接取值/普通CAST,转换失败时会返回null而非触发作业报错,参考修改后的查询语句:
SELECT TRY_CAST(Records.ArrayValue.count AS int) as [count], TRY_CAST(Records.ArrayValue.total AS bigint) as [total], TRY_CAST(Records.ArrayValue.minimum AS float) as [minimum], TRY_CAST(Records.ArrayValue.maximum AS float) as [maximum], LEFT(Records.ArrayValue.resourceId, 200) as [resourceId], LEFT(Records.ArrayValue.metricName, 100) as [metricName], LEFT(Records.ArrayValue.timeGrain, 20) as [timeGrain], TRY_CAST(Records.ArrayValue.average AS float) as [average] INTO OrderSynapse FROM dbhub d CROSS APPLY GetArrayElements(d.records) AS Records
- 重建作业时,将作业的启动时间设置为当前时间之后,避开Event Hub中残留的旧异常数据,确认新流入的正常数据不再触发报错。
内容的提问来源于stack exchange,提问作者woody2k
相关产品推荐
相关产品推荐

