如何在Python中为Azure数据工厂创建管道活动之间的依赖关系

如何在Python中为Azure数据工厂创建管道活动之间的依赖关系,python,dependencies,azure-data-factory,Python,Dependencies,Azure Data Factory,在Azure DataFactory管道中,我尝试使两个CopyActivity按顺序运行,即第一个将数据从blob复制到SQL表,然后第二个将SQL表复制到另一个数据库 我尝试了下面的代码,但结果管道没有基于活动构建的依赖关系(从工作流图和JSON中检查Azure UI)。当我运行管道时,我得到如下错误消息: “ErrorResponseException:模板验证失败:'第'1'行和'22521'列的模板操作'my second activity nameScope'的'runAfter'属

在Azure DataFactory管道中,我尝试使两个CopyActivity按顺序运行,即第一个将数据从blob复制到SQL表,然后第二个将SQL表复制到另一个数据库

我尝试了下面的代码,但结果管道没有基于活动构建的依赖关系(从工作流图和JSON中检查Azure UI)。当我运行管道时,我得到如下错误消息: “ErrorResponseException:模板验证失败:'第'1'行和'22521'列的模板操作'my second activity nameScope'的'runAfter'属性包含不存在的操作。Balababala…”

一旦我在Azure UI中手动添加依赖项,我就可以成功运行管道

如果有人能给我指出示例代码(Python/C#/Powershell)或文档,我将不胜感激。 我的Python代码:

    def createDataFactoryRectStage(self,  
                               aPipelineName, aActivityStageName, aActivityAcquireName,
                               aRectFileName, aRectDSName,
                               aStageTableName, aStageDSName,
                               aAcquireTableName, aAcquireDSName):
    adf_client = self.__getAdfClient()

    ds_blob = AzureBlobDataset(linked_service_name = LinkedServiceReference(AZURE_DATAFACTORY_LS_BLOB_RECT), 
                               folder_path=PRJ_AZURE_BLOB_PATH_RECT, 
                               file_name = aRectFileName,
                               format = {"type": "TextFormat",
                                         "columnDelimiter": ",",
                                         "rowDelimiter": "",
                                         "nullValue": "\\N",
                                         "treatEmptyAsNull": "true",
                                         "firstRowAsHeader": "true",
                                         "quoteChar": "\"",})    
    adf_client.datasets.create_or_update(AZURE_RESOURCE_GROUP, AZURE_DATAFACTORY, aRectDSName, ds_blob)

    ds_stage= AzureSqlTableDataset(linked_service_name = LinkedServiceReference(AZURE_DATAFACTORY_LS_SQLDB_STAGE), 
                                   table_name='[dbo].[' + aStageTableName + ']')      
    adf_client.datasets.create_or_update(AZURE_RESOURCE_GROUP, AZURE_DATAFACTORY, aStageDSName, ds_stage)

    ca_blob_to_stage = CopyActivity(aActivityStageName, 
                                    inputs=[DatasetReference(aRectDSName)], 
                                    outputs=[DatasetReference(aStageDSName)], 
                                    source= BlobSource(), 
                                    sink= SqlSink(write_batch_size = AZURE_SQL_WRITE_BATCH_SIZE))

    ds_acquire= AzureSqlTableDataset(linked_service_name = LinkedServiceReference(AZURE_DATAFACTORY_LS_SQLDB_ACQUIRE), 
                                     table_name='[dbo].[' + aAcquireTableName + ']')      
    adf_client.datasets.create_or_update(AZURE_RESOURCE_GROUP, AZURE_DATAFACTORY, aAcquireDSName, ds_acquire)
    dep = ActivityDependency(ca_blob_to_stage, dependency_conditions =[DependencyCondition('Succeeded')])

    ca_stage_to_acquire = CopyActivity(aActivityAcquireName, 
                                       inputs=[DatasetReference(aStageDSName)], 
                                       outputs=[DatasetReference(aAcquireDSName)], 
                                       source= SqlSource(), 
                                       sink= SqlSink(write_batch_size = AZURE_SQL_WRITE_BATCH_SIZE),
                                       depends_on=[dep])

    p_obj = PipelineResource(activities=[ca_blob_to_stage, ca_stage_to_acquire], parameters={})

    return adf_client.pipelines.create_or_update(AZURE_RESOURCE_GROUP, AZURE_DATAFACTORY, aPipelineName, p_obj)

下面是
C#
中的一个示例,它基本上在管道中按顺序链接活动。请记住,在ADFV1中,我们必须将一个活动的输出配置为另一个活动的输入,以链接它们并使它们相互依赖

管道代码片段(请注意dependsOn属性,该属性确保第二个活动在第一个活动成功完成后运行)——

静态管道资源管道定义(DataFactoryManagementClient){
Console.WriteLine(“创建管道”+pipelineName+”);
PipelineResource=新的PipelineResource{
活动=新列表<活动>{
新的文案活动{
Name=copyFromBlobToSQLActivity,
输入=新列表{
新数据集引用{
ReferenceName=blobSourceDatasetName
}
},
输出=新列表
{
新数据集引用{
ReferenceName=sqlDatasetName
}
},
Source=新的BlobSource{},
Sink=newsqlsink{}
},
新的文案活动{
Name=copyToSQLServerActivity,
输入=新列表{
新数据集引用{
ReferenceName=sqlDatasetName
}
},
输出=新列表
{
新数据集引用{
ReferenceName=sqlDestinationDatasetName
}
},
Source=新的SqlSource{},
Sink=新的SqlSink{},
DependsOn=新列表{
新ActivityDependency{
Activity=copyFromBlobToSQLActivity,
DependencyConditions=新列表{
“成功”
}
}
}
}
}
};
WriteLine(SafeJsonConvert.SerializeObject(resource,client.SerializationSettings));
返回资源;
}

查看ADFV2教程,了解全面的解释和更多的场景。

如果有人像我一样遇到与这个老问题相同的问题,python代码中会有一个微妙的错误

将dep更改为使用活动名称,而不是对活动对象的引用,使其对我有效

dep = ActivityDependency(aActivityStageName, dependency_conditions =[DependencyCondition('Succeeded')])
谢谢阿披实。这个C#代码段与上面我的Python代码段完全相同,只是它的内联样式不同。我实际上使用了ADFV2 Python示例代码来构建我的代码片段。我不知道为什么我的Python代码段没有设置依赖项。我实际上分别测试了这两个CopyActivite,它们都可以工作。您是否检查了管道的JSON和图表?
dep = ActivityDependency(aActivityStageName, dependency_conditions =[DependencyCondition('Succeeded')])