如何在Azure Data Factory数据流中转换Log Analytics层级数据格式?
问题场景
需将同一Log Analytics工作区内的表A数据复制到表B,使用Azure Data Factory (ADF) Data Flow处理时,无法完成从嵌套结构的源格式到平键值对目标格式的转换。
源数据格式示例
[ { "tables": [ { "name": "PrimaryResult", "columns": [ {"name": "TimeGenerated", "type": "datetime"}, {"name": "day_of_occurrence", "type": "datetime"}, {"name": "request_id", "type": "string"}, // 其余列省略 ], "rows": [ [ "2024-05-06T00:00:00Z", "2024-05-06T00:00:00Z", "", // 其余字段值省略 ] ] } ] } ]
目标数据格式示例
[ { "TimeGenerated":"2024-05-06T03:59:02.9499434Z", "day_of_occurrence":"2024-05-06T03:59:02.9499434Z", "request_id":"dfasdsad", // 其余键值对省略 }, // 其余对象省略 ]
解决步骤
使用ADF Data Flow的以下组件依次处理:
展开嵌套结构
添加**展开(Flatten)**组件,先展开顶层的tables数组,再展开tables.rows数组,将每一行数据拆分为单独的数据流行,同时保留tables.columns字段用于后续映射。生成键值对数组
添加**派生列(Derived Column)**组件,创建新字段(比如命名为keyValuePairs),使用表达式将列名数组与行值数组配对:zip(columns.name, rows)该表达式会生成类似
[["TimeGenerated", "2024-05-06T00:00:00Z"], ["request_id", ""]]的键值对数组。转换为JSON对象
再添加一个派生列组件,创建新字段(比如命名为targetObject),将键值对数组转换为目标格式的JSON对象:fromKeyValuePairs(zip(columns.name, rows))此步骤会直接生成
{"TimeGenerated":"2024-05-06T00:00:00Z", "request_id":""}格式的对象。清理冗余字段
添加**选择(Select)**组件,仅保留转换后的targetObject字段,移除原有的columns、rows、tables等嵌套字段。输出到目标表
将数据流输出到Log Analytics的目标表B,确保输出设置为JSON数组格式,匹配目标接收要求。
注意事项
- 确保
columns数组的元素数量与rows数组的元素数量完全对应,避免映射错位 - 数值类型(real、int)会被ADF自动保留原有类型,无需额外转换
- 若存在多张表,可在展开前添加过滤条件,仅处理
name为PrimaryResult的目标表
内容的提问来源于stack exchange,提问作者Rish Sri

