如何修改App Center传入Application Insights的Blob结构并解析至SQL数据库
问题1:如何修改从App Center传入Azure Application Insights的Blob结构?
首先得明确你是通过哪种路径把App Center的数据传到AI的——不同方式的调整逻辑不一样:
情况1:App Center导出数据到Blob,再导入AI
App Center自带导出功能生成的Blob格式是固定的(遵循它的事件模型,包含timestamp、eventName、properties、measurements这些核心字段),没法直接修改原始导出结构。但你可以在数据进入AI前加一层中间处理:
- 用Azure Functions监听Blob容器的新增文件事件,读取Blob里的JSON数据,做自定义转换(比如展开嵌套字段、重命名冗余字段、过滤无效内容、把非结构化元素转成结构化格式),然后调用AI的Ingestion API把转换后的数据传进去。
- 要是你用ADF来把Blob数据导入AI,直接在ADF的数据流里添加转换组件(比如派生列、扁平化)调整结构,再写入AI即可。
情况2:App Center应用直接集成AI SDK
这种情况你完全掌控数据结构!在App Center的应用代码里,调用AI的TrackEvent/TrackTrace等方法时,自定义事件的properties和measurements,甚至可以创建自定义的EventTelemetry对象,把你想要的结构定义好再发送。这样数据进入AI后,存储的Blob结构就是你自定义的,后续解析会轻松很多。
问题2:ADF解析AI中Blob的嵌套非结构化元素失败,怎么解决?
针对嵌套非结构化字段的解析难题,给你几个实用方案,也可以结合问题1的思路从源头调整格式:
方案1:用ADF数据流自带的转换能力搞定
ADF的数据流专门针对这类半结构化数据处理做了优化:
- 派生列组件:用表达式直接提取深层嵌套的值,比如
properties['userInfo']['userId'],或者用flatten()函数把嵌套对象展开成顶级字段。 - 扁平化(Flatten)组件:如果嵌套是数组类型,用这个组件把数组拆成多行,或者把嵌套对象的所有字段平铺开,转成关系型结构的列。
- 解析JSON组件:如果某个字段是JSON字符串(不是原生JSON对象),先用这个组件把它转换成结构化对象,再进行后续处理。
- 要是嵌套字段结构不固定(偶尔缺失),可以用
isPresent()函数判断字段是否存在,避免解析报错。
方案2:借助Azure SQL的JSON能力兜底
如果ADF直接处理太复杂,可以先把Blob数据导入SQL的临时表(把整个JSON存成NVARCHAR(MAX)类型的字段),然后用SQL的OPENJSON函数来解析嵌套内容:
SELECT event.timestamp, event.eventName, JSON_VALUE(event.properties, '$.userInfo.userId') AS userId, JSON_QUERY(event.properties, '$.userInfo.address') AS userAddress -- 保留嵌套结构 FROM temp_ai_data CROSS APPLY OPENJSON(json_content) WITH ( timestamp DATETIME2 '$.timestamp', eventName NVARCHAR(100) '$.eventName', properties NVARCHAR(MAX) '$.properties' AS JSON -- 标记为JSON类型,方便后续解析 ) AS event
这种方法适合处理结构多变的非结构化嵌套,SQL的JSON函数灵活性很强,甚至可以把动态字段转成列。
方案3:从AI端提前调整数据格式
回到源头解决问题:
- 如果是直接通过SDK发数据到AI,在发送前就把非结构化的嵌套字段处理好——比如把深层嵌套的字段提升到顶级
properties,或者把数组拆成多个独立事件发送。 - 如果是从App Center导出到Blob再进AI,就在Blob到AI的中间步骤(比如Azure Functions)提前转换结构,把非结构化部分转成结构化,再传入AI,这样ADF解析时就不用头疼了。
内容的提问来源于stack exchange,提问作者Gagan Madaan
相关产品推荐
相关产品推荐

