变量中Zero Padding优化咨询:替代循环迭代的更优实现方法
场景说明
- 输入值=1234,Input Range=2,预期输出=1200
- 输入值=12345,Input Range=3,预期输出=12000
- 需求:将输入值右侧对应Input Range数量的数字替换为零
当前实现逻辑
{ "name": "RoundPad", "properties": { "activities": [ { "name": "ForEach1", "type": "ForEach", "dependsOn": [], "userProperties": [], "typeProperties": { "items": { "value": "@range(1,pipeline().parameters.Range)", "type": "Expression" }, "isSequential": true, "activities": [ { "name": "Set variable1", "type": "SetVariable", "dependsOn": [], "userProperties": [], "typeProperties": { "variableName": "TempPower", "value": { "value": "@string(mul(int(variables('Power')),10))", "type": "Expression" } } }, { "name": "Set variable2", "type": "SetVariable", "dependsOn": [ { "activity": "Set variable1", "dependencyConditions": [ "Succeeded" ] } ], "userProperties": [], "typeProperties": { "variableName": "Power", "value": { "value": "@variables('TempPower')", "type": "Expression" } } } ] } }, { "name": "Set variable3", "type": "SetVariable", "dependsOn": [ { "activity": "ForEach1", "dependencyConditions": [ "Succeeded" ] } ], "userProperties": [], "typeProperties": { "variableName": "Output", "value": { "value": "@string(mul(div(int(pipeline().parameters.Input),int(variables('Power') )),int(variables('Power'))))", "type": "Expression" } } } ], "parameters": { "Input": { "type": "string", "defaultValue": "1234" }, "Range": { "type": "int", "defaultValue": 2 } }, "variables": { "TempPower": { "type": "String", "defaultValue": "1" }, "Output": { "type": "String" }, "Power": { "type": "String", "defaultValue": "1" } }, "annotations": [] } }
问题
是否存在无需借助ForEach迭代和多变量的更优实现方法?
优化方案
当然有更简洁的实现方式,完全不需要ForEach迭代和多变量。利用Azure Data Factory的内置表达式就能一步完成需求:
- 用
power(10, pipeline().parameters.Range)直接计算出对应位数的10次幂(比如Range=2时得到100,Range=3时得到1000) - 对输入值执行「整除该幂次后再乘以该幂次」的操作,就能自动将右侧对应位数的数字置零
- 最后把结果转为字符串即可
对应的表达式如下:
@string(mul(div(int(pipeline().parameters.Input), power(10, pipeline().parameters.Range)), power(10, pipeline().parameters.Range)))
简化后的Pipeline只需要保留一个SetVariable活动和Output变量,具体结构如下:
{ "name": "RoundPad", "properties": { "activities": [ { "name": "Set Output", "type": "SetVariable", "dependsOn": [], "userProperties": [], "typeProperties": { "variableName": "Output", "value": { "value": "@string(mul(div(int(pipeline().parameters.Input), power(10, pipeline().parameters.Range)), power(10, pipeline().parameters.Range)))", "type": "Expression" } } } ], "parameters": { "Input": { "type": "string", "defaultValue": "1234" }, "Range": { "type": "int", "defaultValue": 2 } }, "variables": { "Output": { "type": "String" } }, "annotations": [] } }
这种方式代码更简洁,执行效率也更高,省去了循环迭代的额外开销。
内容的提问来源于stack exchange,提问作者Nandan
相关产品推荐
相关产品推荐

