我正在使用Azure数据工厂。我正在尝试使用String变量在JSON数组中查找Key并检索其Value。我似乎无法弄清楚如何在ADF中执行此操作。
详细信息:
我已经定义了一个名为“ obj”的管道参数,键入“ Object”和内容:{"values":{"key1":"value1","key2":"value2"}}
我需要使用此管道来查找名为“ key1”的值,并将其作为“ value1”返回; “ key2”并将其返回为“ value2” ...,依此类推。我打算将我的“ obj”用作字典,以实现此目的。
从技术上讲,如果我想找到key2的值,我可以使用下面的代码,它将返回“ value2”:
@pipeline().parameters.obj.values.key2
我不知道是如何使用变量(而不是硬编码的“ key2”)来实现的。
[清除内容:我有一个for循环,并且在其中,我只有一个复制活动:for-each contents复制活动的目的是复制名为item().name
的文件,但根据[obj]将其保存为ADLS item().name
所转换的任何内容
这是使用Python可以构建for循环的方式:python-for-loop
[在ADF中,我尝试了很多事情(使用concat,replace ...),但没有任何效果。最简单的是:
@pipeline().parameters.obj.values.item().name
但是会引发以下错误:
{"code":"BadRequest","message":"ErrorCode=InvalidTemplate, ErrorMessage=Unable to parse expression 'pipeline().parameters.obj.values.item().name'","target":"pipeline/name_of_the_pipeline/runid/run_id","details":null,"error":null}
所以,您能提供一些如何定义我的表情的想法吗?我觉得这一定很明显,但我没到那里.....谢谢。
根据您的评论,这是Filter活动的输出。 Filter活动的输出是一个包含名为value的数组的对象,因此您需要遍历“ output.value”:
在ForEach内部,您使用“ item()。name”引用项目的名称:
基于更多信息的编辑:
现在的任务是获取@item()。name值,并将其用作针对JSON数组的动态属性名称。鉴于管道表达语言(PEL)的有限性质,这是一个挑战。 PEL中的数组元素只能由其索引值引用,因此,要进行这种复杂的查找,您将需要遍历数组并进行一些字符串解析。由于您已经在FOR循环中,并且不支持嵌套的FOR循环,因此您将需要执行另一个管道来处理此过程以及Copy活动。警告:这很难看,但是可以。
子管道
用两个参数定义一个管道,一个用于values数组,一个用于item()。名称:
执行子管道时,将@ pipeline.parameters.obj.values传递为“ valuesArray”,将@ item()。name传递为“ keyValue”。
向TRUE条件添加活动,该活动将值解析为变量[在这里变得非常丑陋:
]同时,返回管道
此时,在ForEach之后,您将拥有一个变量(IterationValue),其中包含原始数组中的正确值:
现在有了这个值,您就可以在Copy活动中将该变量用作DataSet参数。
你好,Pythonista朋友!
[ADF中的解决方案实际上就像在Python中那样,通过将方括号内的'变量'括起来来引用。
我创建了一个参数obj这样的管道
并且作为演示,管道具有单个Set Variable活动,该活动将key2的值转换为变量。
已记录在案,但您需要X射线观察才能发现它here。