ADF/Synapse复制数据活动映射中读取数组最后一项的语法
ADF复制活动JSON路径取数组最后一项方案
正确语法
Azure Data Factory复制活动架构映射内置的JSONPath实现不支持last()函数,直接使用负整数索引即可从数组末尾定位元素,-1就对应数组最后一项,完全不需要硬编码正向索引值。
你场景下三个字段的正确映射路径如下:
- 传感器名称:
$['meta']['params']['sensors'][*]['name'](原路径无需修改) - 最新读数时间:
$['meta']['sensorReadings'][*]['readings'][-1]['dateTime'] - 最新读数值:
$['meta']['sensorReadings'][*]['readings'][-1]['value']
该语法规则下,
-n代表倒数第n个元素:-1是最新1条、-2是倒数第2条,哪怕传感器离线导致API返回的readings数组长度不足192,也不会出现硬编码[191]时的数组越界报错,会自动拉取到数组内存储的最新一条记录。
你之前尝试的几种last相关写法均不生效,原因是last()属于高级JSONPath函数,仅在ADF映射数据流、表达式编辑器内支持,复制活动的可视化映射路径不识别该函数语法。
更优实现建议
- 最低改造成本方案:直接替换为上述
[-1]索引即可,不需要调整现有15分钟触发逻辑、活动结构,就能解决之前逐次尝试索引、6次失败漏数的问题,只要API返回的readings数组非空就能正确取到最新值。 - 高灵活度方案:在复制活动前新增Lookup活动拉取API全量响应,通过ADF内置表达式
@last(json(activity('调用API').output.Response).meta.sensorReadings[0].readings)直接提取最新读数对象,校验时间有效性、过滤离线异常值后再传入复制活动写入数据湖,适合需要加数据校验规则的场景。 - 高容错方案:配置复制活动直接扁平化展开所有传感器的全量
readings记录写入数据湖,写入时通过接收器端的转换逻辑按传感器ID分组、取dateTime最大的1条记录,哪怕后续API返回的记录排序规则变化、出现乱序,也不会取错最新值。
内容的提问来源于stack exchange,提问作者lexpagee
相关产品推荐
相关产品推荐

