Azure Data Factory读取JSON数组并写入独立CSV文件的实现方案
实现方案(基于Azure Data Factory/Synapse 管道)
前置准备
- 提前为管道配置目标存储账户的
Storage Blob Data Contributor权限,或者提前生成存储账户的SAS令牌用于后续API鉴权。 - 先修正JSON示例中的笔误:
Timestamp:键多了多余冒号,生产环境需保证JSON键名格式统一。
步骤1:按目标文件分组JSON对象
你已拿到所有独立JSON对象,先按AzureFilename字段做分组,相同AzureFilename的对象归为同一组,保证同组数据写入同一个CSV文件。
步骤2:构造CSV内容与目标文件名
先为每组初始化两个字符串类型变量:
csvContent:存储拼接完成的CSV完整内容csvFileName:存储生成的目标CSV文件名
文件名生成
用内置函数转换时间戳后拼接即可匹配命名规则,表达式参考:
@concat( formatDateTime(unixtimeSecondsToDateTime(int(item().Timestamp)), 'ddMMyyyy'), '_', item().AzureFilename, '.csv' )
CSV内容拼接
- 如果是当前组第一个对象,先写入CSV表头:
Timestamp,ItemName,Value - 逐行拼接每个JSON对象的对应字段,参考表达式:
@concat( item().Timestamp, ',', replace(item().ItemName, '"', '""'), // 转义字段内的双引号 ',', string(item().Value), '\n' )
如果字段值存在逗号、换行符,需额外给字段包裹双引号避免CSV格式错位。
步骤3:直接写入CSV到指定位置(无需配置Source数据源)
直接调用Azure Blob存储的Append Blob REST API实现写入,完全通过动态参数指定路径,不需要提前配置固定Source数据集:
先做文件存在性判断
调用HEAD请求访问目标路径,返回200说明文件已存在,返回404说明文件需新建:
- 新建文件请求配置:
- 请求方法:
PUT - 请求URL:
@concat('https://<你的存储账户名>.blob.core.windows.net/', item().AzureContainer, '/', item().AzureFolderName, '/', variables('csvFileName')) - 请求头:
x-ms-blob-type=AppendBlob,x-ms-version=2020-04-08 - 请求体为空即可
- 请求方法:
追加CSV内容
- 请求方法:
PUT - 请求URL:
@concat('https://<你的存储账户名>.blob.core.windows.net/', item().AzureContainer, '/', item().AzureFolderName, '/', variables('csvFileName'), '?action=append&position=<文件现有长度>')
如果是新建文件后直接写入,position填0即可;如果是追加已有文件,需从HEAD请求的响应头Content-Length取现有文件长度作为position值,避免内容覆盖 - 请求头:
Content-Type=text/csv,鉴权字段用托管身份的Bearer令牌或者SAS令牌 - 请求体直接填拼接完成的
variables('csvContent')即可
可选简化方案
如果允许使用通用动态数据集,也可以配置一个参数化的分隔文本数据集,把容器、文件夹、文件名都设为动态参数,无需绑定固定Source。用Copy活动时Source直接传你构造好的JSON数组表达式,Sink选这个参数化数据集并开启追加模式,无需手动处理API调用逻辑,稳定性更高。
内容的提问来源于stack exchange,提问作者Cornel Verster
相关产品推荐
相关产品推荐

