在Azure Data Factory中处理Airbyte JSON输出的技术咨询
处理Airbyte输出JSON至Azure Data Factory目标表结构的解决方案
原始JSON结构
{ "_airbyte_ab_id" :"8891ab71-f3fa-456d-868a-f3342b21bf35", "_airbyte_emitted_at" :1699631208334, "_airbyte_data": { "data": { "3c7499774c94f63155f483737": { "master_account_id" :"", "name" :"Test_Account", "status": { "active" :false, "voip" :false, "portal_access" :false, "billing" :false }, "sales_person" :"jayleno", "agent" :"", "timezone" :"America/New_York", "website" :"", "created_at" :"2015-04-23T14:47:21Z", "updated_at" :"2022-09-27T00:31:32Z" }, "8eb4decb9ddcf0d44e69e329f": { "master_account_id" :"", "name" :"Test_Account2", "status": { "active" :false, "voip" :false, "portal_access" :false, "billing" :false }, "sales_person" :"conanobrien", "agent" :"", "timezone" :"America/New_York", "website" :"", "created_at" :"2015-05-13T17:47:02Z", "updated_at" :"2018-03-13T04:14:38Z" } }, "status" :"success", "code" :"200", "last_key" :"8eb4decb9ddcf0d44e69e329f" } }
目标表结构
| AccountId | Name | Active | VoiP | SalesRep | Agent | Timezone | Website |
|---|---|---|---|---|---|---|---|
| 3c7499774c94f63155f483737 | Test_Account | false | false | jayleno | null | America/New York | null |
| 8eb4decb9ddcf0d44e69e329f | Test_Account2 | false | false | conanobrien | null | America/New York | null |
遇到的问题
- 从Blob存储读取JSON后始终是复杂嵌套结构
- Flatten步骤中
Unroll By选项置灰,无法选择展开目标 - Select步骤仅能单独提取AccountId,无法完整映射目标表所有字段
解决步骤
1. 数据流源配置
选择Blob存储作为数据流源,文档格式设置为JSON,根据文件数量选择Single document或Array of documents(本次为单文档)。
2. 添加Parse活动转换动态键为数组
由于原始JSON中账号是动态GUID键,无法直接展开,需先将对象转为键值对数组:
- 添加Parse活动,在
Output column type中选择Array,使用表达式:
此表达式会将mapKeysToEntries(_airbyte_data.data)_airbyte_data.data下的GUID键值对转换为[{key: "GUID值", value: {账号详情}}]格式的数组,此时即可获得可展开的数组结构。
3. 使用Flatten活动展开数组
- 选择Parse活动的输出作为Flatten的输入,此时
Unroll By选项将可选,选择刚才生成的键值对数组。 - 展开后会生成
key(即AccountId)和value(包含所有账号嵌套字段)两列。
4. 用Select活动映射目标列
在Select活动中配置字段映射,同时处理空值和格式转换:
| 目标列 | 表达式 |
|---|---|
| AccountId | key |
| Name | value.name |
| Active | value.status.active |
| VoiP | value.status.voip |
| SalesRep | value.sales_person |
| Agent | iif(value.agent == "", null(), value.agent) |
| Timezone | replace(value.timezone, "_", " ") |
| Website | iif(value.website == "", null(), value.website) |
5. 输出到目标数据库
添加Sink活动,配置目标数据库及对应表,将Select活动的输出字段与表字段一一映射,完成数据写入。
注意事项
- ADF字段名区分大小写,需严格匹配原始JSON中的字段名称
- 可通过数据流的
Data Preview功能查看每一步的输出结果,验证结构是否正确 - 若处理批量JSON文件,需在源设置中开启
Wildcard paths并配置正确的文件路径匹配规则
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

