如何在ADF数据流与Synapse Data Flow中实现JSON转换操作?
数据流转换解决方案
一、ADF数据流拆分JSON字符串行与扁平化转换方法
1. 扁平化嵌套结构化JSON
如果源是带嵌套数组的JSON,用Flatten(扁平化)转换:
- 把Flatten转换拖到数据流画布,连接到源数据集
- 在Flatten设置里,选要展开的数组列作为
Unroll by - 勾选要保留的列,或者直接选"Unroll all hierarchies"自动展开所有层级
- 配置完后,嵌套数组会被拆成多行
2. 拆分存储为字符串的JSON
如果源数据里的JSON是字符串类型,先解析再处理:
- 加**Derived Column(派生列)**转换,用
json(你的JSON字符串列名)把字符串转成JSON对象 - 接着用**Select(选择)**转换提取字段,或者直接用Flatten转换展开嵌套结构
- 如果JSON字符串是数组格式,直接用Flatten的
Unroll by选解析后的数组列就行
二、Synapse Data Flow转换指定JSON为目标表格
待转换的JSON数据:
{"2023-12-11T00:00:00+01:00": 1272,"2023-12-12T00:00:00+01:00": 1436,"2023-12-13T00:00:00+01:00": 1173,"2023-12-14T00:00:00+01:00": 1083,"2023-12-15T00:00:00+01:00": 1231,"2023-12-16T00:00:00+01:00": 854,"2023-12-17T00:00:00+01:00": 805,"2023-12-18T00:00:00+01:00": 1021,"2023-12-19T00:00:00+01:00": 1112,"2023-12-20T00:00:00+01:00": 1192,"2023-12-21T00:00:00+01:00": 1071,"2023-12-22T00:00:00+01:00": 1089,"2023-12-23T00:00:00+01:00": 942,"2023-12-24T00:00:00+01:00": 879,"2023-12-25T00:00:00+01:00": 911,"2023-12-26T00:00:00+01:00": 1167,"2023-12-27T00:00:00+01:00": 1070,"2023-12-28T00:00:00+01:00": 1172,"2023-12-29T00:00:00+01:00": 953,"2023-12-30T00:00:00+01:00": 780,"2023-12-31T00:00:00+01:00": 749,"2024-01-01T00:00:00+01:00": 703,"2024-01-02T00:00:00+01:00": 1045}
目标表格格式:
| Date | Total |
|---|---|
| 2023-12-11 | 1272 |
| 2023-12-12 | 1436 |
| 2023-12-13 | 1173 |
转换步骤:
- 配置源数据集:把上述JSON作为源,设置源数据集格式为JSON,读取模式选"Single document"
- 添加派生列转换:把整个JSON转成键值对数组,用这个表达式:
mapKeys(toString($$), (key, value) => createMap('DateKey', key, 'TotalValue', value))- 作用:遍历JSON的所有键值对,把每个键值对转成包含
DateKey(日期字符串)和TotalValue(数值)的Map对象,最终生成数组
- 作用:遍历JSON的所有键值对,把每个键值对转成包含
- 添加扁平化转换:
- 在
Unroll by里选上一步生成的数组列 - 展开数组里的
DateKey和TotalValue到顶级列
- 在
- 处理日期格式:再加一个派生列转换,创建新列
Date,用表达式:substring(DateKey, 1, 10)- 作用:截取日期字符串的前10位,得到
YYYY-MM-DD格式的日期
- 作用:截取日期字符串的前10位,得到
- 整理列:添加选择转换,保留
Date和TotalValue列,把TotalValue重命名为Total - 配置接收器:把输出连接到目标数据集(比如Azure SQL、Parquet等),确保列名匹配目标格式
内容的提问来源于stack exchange,提问作者Euclides Jaime
相关产品推荐
相关产品推荐

