如何在Azure Data Factory Data Flow中转换嵌套行列JSON为CSV?
使用Azure Data Flow将嵌套JSON转CSV的实操方案
问题说明
现有如下结构的JSON数据:
{ "columns": [ {"name": "EmpNo", "fieldId": 67, "type": "text"}, {"name": "datetime", "fieldId": 564, "type": "datetime"}, {"name": "analytics", "fieldId": 56, "type": "text"}, {"name": "category", "fieldId": 45, "type": "text"}, {"name": "code", "fieldId": 12, "type": "text"} ], "rows": [ [13, "8/7/2021 1:06:13 AM", "demo", "demo/1", "spee-analytics"], [23, "1/24/2022 8:30:28 AM", "speed", "win", "check-123"], // 剩余454行数据 ] }
需要转成CSV格式,要求表头对应columns里的name字段,每行数据对应rows数组值,最终效果如下:
EmpNo,datetime,analytics,category,code 13,8/7/2021 1:06:13 AM,demo,demo/1,spee-analytics 23,1/24/2022 8:30:28 AM,speed,win,check-123
操作步骤
1. 配置JSON数据源
- 新建Azure Data Flow,添加JSON数据源,指向你的JSON文件存储位置(Blob/ADLS等)。
- 数据源连接设置里,将JSON读取模式设为
Document,因为这是单文档结构的JSON。
2. 完成列名与行数据的映射
2.1 提取列名列表
添加派生列转换,新建列columnNames,用以下表达式提取columns数组中的name字段:
map(columns, #item.name)
执行后会生成数组:["EmpNo", "datetime", "analytics", "category", "code"]
2.2 把行数据和列名配对成键值对
再添加一个派生列转换,新建列rowWithColumns,用以下表达式将rows数组元素和columnNames做键值映射:
mapZip(columnNames, rows, (k,v) => createMap(k, v))
此时每行数据会变成带列名的键值对对象,比如第一行变为:
{"EmpNo":13, "datetime":"8/7/2021 1:06:13 AM", "analytics":"demo", "category":"demo/1", "code":"spee-analytics"}
2.3 展开键值对为列
添加展开转换,选择rowWithColumns列,设置展开模式为展开到列。Data Flow会自动识别所有键作为列名,把键值对展开成对应的列。
3. 输出CSV
添加CSV接收器,指向目标存储位置,配置如下:
- 启用表头设置,自动用展开后的列名作为CSV表头。
- 根据需求设置分隔符、编码等参数,运行Data Flow即可完成转换。
排查要点
- 若展开后列名不对,检查
map表达式是否正确提取了columns的name字段,确认数据源中columns的层级引用正确(比如是否需要用$或层级路径指定)。 - 若行数据映射失败,确认
mapZip的两个数组长度一致,rows里每个子数组的元素数量和columns的数量匹配。
内容的提问来源于stack exchange,提问作者sthambi
相关产品推荐
相关产品推荐

