使用utcnow()作为管道参数的Azure Data Factory v2

时间:2018-06-22 11:15:51

标签: azure azure-data-factory azure-data-factory-2

对于上下文,我目前有一个Data Factory v2管道,该管道带有一个ForEach活动,该活动调用Copy活动。复制活动只是将数据从FTP服务器复制到Blob存储容器。

这是管道json文件:

{ "name": "pipeline1", "properties": { "activities": [ { "name": "ForEach1", "type": "ForEach", "typeProperties": { "items": { "value": "@pipeline().parameters.InputParams", "type": "Expression" }, "isSequential": true, "activities": [ { "name": "Copy1", "type": "Copy", "policy": { "timeout": "7.00:00:00", "retry": 0, "retryIntervalInSeconds": 30, "secureOutput": false }, "typeProperties": { "source": { "type": "FileSystemSource", "recursive": true }, "sink": { "type": "BlobSink" }, "enableStaging": false, "cloudDataMovementUnits": 0 }, "inputs": [ { "referenceName": "FtpDataset", "type": "DatasetReference", "parameters": { "FtpFileName": "@item().FtpFileName", "FtpFolderPath": "@item().FtpFolderPath" } } ], "outputs": [ { "referenceName": "BlobDataset", "type": "DatasetReference", "parameters": { "BlobFileName": "@item().BlobFileName", "BlobFolderPath": "@item().BlobFolderPath" } } ] } ] } } ], "parameters": { "InputParams": { "type": "Array", "defaultValue": [ { "FtpFolderPath": "/Folder1/", "FtpFileName": "@concat('File_',formatDateTime(utcnow(), 'yyyyMMdd'), '.txt')", "BlobFolderPath": "blobfolderpath", "BlobFileName": "blobfile1" }, { "FtpFolderPath": "/Folder2/", "FtpFileName": "@concat('File_',formatDateTime(utcnow(), 'yyyyMMdd'), '.txt')", "BlobFolderPath": "blobfolderpath", "BlobFileName": "blobfile2" } ] } } }, "type": "Microsoft.DataFactory/factories/pipelines" }

我遇到的问题是,在指定管道参数时,似乎无法使用系统变量和功能,例如为blob存储数据集指定文件夹路径时。 这样的结果是formatDateTime(utcnow(), 'yyyyMMdd')不会被解释为函数调用,而是真正的字符串,其值为“ formatDateTime(utcnow(),'yyyyMMdd')”。

为了解决这个问题,我想我应该使用触发器来执行我的管道,并将触发器的执行时间作为参数传递给trigger().startTime这样的管道,但这是唯一的方法吗?我只是在管道的json中做错什么了?

3 个答案:

答案 0 :(得分:0)

您不能将动态表达式设置为默认值。您应该在创建触发器时或在复制活动的接收器/源中定义数据集参数时定义此表达式和函数。 因此,您可以在源数据集中创建具有默认值的数据集属性FtpFileName,然后在复制活动中,可以在源类别中指定该动态表达式。

example

另一种方法是定义管道参数,然后在定义触发器时向该管道参数添加动态表达式。希望这是对您的明确答复。 :)

答案 1 :(得分:0)

参数的默认值不能为表达式。它们必须是文字字符串。 您可以使用触发器来实现。或者,您可以提取表达式的公共部分,然后将文字值放入foreach项中。

答案 2 :(得分:0)

这应该起作用: File _ @ {formatDateTime(utcnow(),'yyyyMMdd')}

或复杂路径: rootfolder / subfolder / @ {formatDateTime(utcnow(),'yyyy')} / @ {formatDateTime(utcnow(),'MM')} / @ {formatDateTime(utcnow(),'dd')} / @ {formatDateTime( utcnow(),'HH')}