Azure Data Factory:如何在ForEach循环中正确使用Lookup结果(Python)
问题描述
我需要让ForEach循环遍历Lookup活动输出中的各个Prop_元素,每次迭代仅传递一个CSV文件名给自定义Batch Python脚本,但当前使用@{item()}传递时,脚本收到的是所有Prop_的集合,而非单个文件名。
编辑:我认为出现方括号的原因是Python脚本返回的文件名是一个列表。Lookup活动的输出如下:
{ "count": 1, "value": [ { "Prop_0": "['BAT.WISCDD1C.SC.DK002001.D2023191.CSV'", "Prop_1": " 'BAT.WISCDD1C.SC.DK002001.TOT.D2023191.CSV'", "Prop_2": " 'BAT.WISCDD4C.SC.DK002004.D2023191.CSV'", "Prop_3": " 'BAT.WISCDE1C.SC.DK003001.D2023191.CSV'", "Prop_4": " 'BAT.WISCDE3C.SC.DK003003.D2023191.CSV'", "Prop_5": " 'BAT.WISCDE4C.SC.DK003004.D2023191.CSV'", "Prop_6": " 'BAT.WISCDE5C.SC.DK003005.D2023191.CSV'", "Prop_7": " 'BAT.WISCDP1C.SC.DK001001.D2023191.CSV'", "Prop_8": " 'BAT.WISCDU1C.SC.DK004011.D2023191.CSV'", "Prop_9": " 'BAT.WISCDU4C.SC.DK004014.D2023191.CSV'", "Prop_10": " 'BAT.WISCDU7C.SC.DK004017.D2023191.CSV']" } ], "effectiveIntegrationRuntime": "integrationRuntime1 (West Europe)", "billingReference": { "activityType": "PipelineActivity", "billableDuration": [ { "meterType": "ManagedVNetIR", "duration": 0.016666666666666666, "unit": "Hours" } ] }, "durationInQueue": { "integrationRuntimeQueue": 0 } }
ForEach循环需要遍历这些Prop_元素,逐个传递给自定义Batch Python脚本,但在Batch自定义活动中使用@{item()}引用项时,Python脚本接收到的参数是所有Prop_的集合:
{Prop_0:[ 'BAT.WISCDD1C.SC.DK002001.D2023191.CSV', Prop_1: 'BAT.WISCDD1C.SC.DK002001.TOT.D2023191.CSV', Prop_2: 'BAT.WISCDD4C.SC.DK002004.D2023191.CSV', Prop_3: 'BAT.WISCDE1C.SC.DK003001.D2023191.CSV', Prop_4: 'BAT.WISCDE3C.SC.DK003003.D2023191.CSV', Prop_5: 'BAT.WISCDE4C.SC.DK003004.D2023191.CSV', Prop_6: 'BAT.WISCDE5C.SC.DK003005.D2023191.CSV', Prop_7: 'BAT.WISCDP1C.SC.DK001001.D2023191.CSV', Prop_8: 'BAT.WISCDU1C.SC.DK004011.D2023191.CSV', Prop_9: 'BAT.WISCDU4C.SC.DK004014.D2023191.CSV', Prop_10: 'BAT.WISCDU7C.SC.DK004017.D2023191.CSV']}
我不清楚如何正确使用value中的Prop_元素,希望每次ForEach迭代仅传递一个CSV文件名。请问我哪里操作错误?
解决方案
1. 先清理Lookup输出的格式问题
从Lookup输出可以看到,部分Prop_的值带有冗余的列表符号([]、'),需要先清理成纯文件名:
- 添加一个Set Variable活动,创建数组变量存储整理后的文件名,使用表达式逐个处理Prop_值:
将结果存入变量(例如@createArray( replace(replace(activity('Lookup').output.value[0].Prop_0, '[', ''), "'", ""), replace(activity('Lookup').output.value[0].Prop_1, "'", ""), replace(activity('Lookup').output.value[0].Prop_2, "'", ""), replace(activity('Lookup').output.value[0].Prop_3, "'", ""), replace(activity('Lookup').output.value[0].Prop_4, "'", ""), replace(activity('Lookup').output.value[0].Prop_5, "'", ""), replace(activity('Lookup').output.value[0].Prop_6, "'", ""), replace(activity('Lookup').output.value[0].Prop_7, "'", ""), replace(activity('Lookup').output.value[0].Prop_8, "'", ""), replace(activity('Lookup').output.value[0].Prop_9, "'", ""), replace(replace(activity('Lookup').output.value[0].Prop_10, ']', ''), "'", "") )FileNameList)。
2. 配置ForEach循环的遍历对象
将ForEach循环的Items属性设置为整理后的文件名数组:
@variables('FileNameList')
3. 在Batch活动中传递单个文件名
在Batch自定义活动的参数中,直接使用@{item()}即可获取每次迭代的单个CSV文件名。
替代方案:直接遍历Prop_属性
如果不想用Set Variable,可直接在ForEach的Items中定义Prop_值的数组:
@createArray( activity('Lookup').output.value[0].Prop_0, activity('Lookup').output.value[0].Prop_1, ... activity('Lookup').output.value[0].Prop_10 )
然后在传递参数时清理冗余符号:
@replace(replace(item(), '[', ''), "'", "")
内容的提问来源于stack exchange,提问作者Eve
相关产品推荐
相关产品推荐

