我想为Azure blob conainters创建链接服务,其帐户信息来自Azure SQL数据库。由于条目和帐户信息的数量是动态的,因此我无法在Azure数据工厂的设置部分中定义Azure blob容器的链接服务。 Azure数据工厂中的链接服务可以直接动态创建吗?
答案 0 :(得分:2)
不幸的是,在当前版本的ADF中这是不可能的。您只能使用函数来引用与管道执行相关的元素(执行日期/时间)。您无法使用其他数据源动态定义Blob名称。
您可以使用数据工厂中的功能以及上述功能 系统变量用于以下目的:
- 指定数据选择查询(请参阅引用的连接器文章 通过数据移动活动文章。调用数据的语法 工厂功能是:$$用于数据选择查询等 活动和数据集中的属性。
- 使用活动中的数据工厂函数指定输入依赖项 输入集合(见上面的示例)。指定时不需要$$ 输入依赖表达式。
醇>
从这里开始:https://docs.microsoft.com/en-us/azure/data-factory/data-factory-functions-variables
这就是你目前用blob输入做的一切:https://docs.microsoft.com/en-us/azure/data-factory/data-factory-azure-blob-connector
在你的情况下,我建议如果你可以重新定义你的输入blob,以获得可以从执行管道的日期/时间派生的名称/文件夹,而不是你可以获得该功能。
或者你可以进行一次从sql获取信息的usql调用,然后将blob移动到一个带日期戳的文件夹中,管道可以接收该文件夹。
答案 1 :(得分:0)
我认为通过将Powershell脚本与数据工厂cmdlet和Azure功能相结合来运行它们是可能的。因此,PowerShell需要连接并从存储中获取schmas,创建数据集并部署它们,更改管道,设置pipline计划和添加/删除元素,然后恢复(或仅设置当天的管道启动)过程。但这需要做很多工作。
但是现在预览版本2中的Data Factory提供了更多选项,包括使用SSIS,因此可以解决这个问题。
答案 2 :(得分:0)
我实际上是使用python sdk进行此操作的,不仅对链接服务进行此操作,而且对于每个Activity,我的所有元数据都存储在SQL Server表中(我称之为adf.Mapping),该表具有以下列:source_linked_service_name,source_dataset,target_linked_service_name,target_dataset
创建链接服务所需的元数据存储在另一个表中,我只是通过使用linked_service_name来获得的,我有一个计划任务,该任务每天运行我的python脚本,如果使用提到的库进行了某些更改,它将更新链接服务以上:
properties = SqlServerLinkedService(connection_string=connection_string,
user_name=user_name,
password=password,
connect_via=ir_sql_server)
adf_client.adf_object.linked_services.create_or_update( resource_group_name=resource_group_name, factory_name=data_factory_name, linked_service_name=self.name, properties=properties)
logger.info('Created SQL Server linked service: ' + str(self.name))
答案 3 :(得分:0)
使用“执行SSIS包”任务可以在巫婆中运行ssis包,从而可以管理动态数据源。
第二种方法是使用“笔记本”任务。然后,您需要运行Python或Scala以连接到具有连接信息的源,然后以某种循环或其他方式创建数据集以实现目标。
在ADF(甚至是v2)中,通过使用ADF对象,您无法做到这一点。
答案 4 :(得分:0)
一种方法是使用Azure Databricks笔记本
另一种方法是参数化值
{
"type":"Microsoft.DataFactory/factories/linkedservices",
"properties":{
"parameters": {
"StorageAccountEndpoint": {
"type": "String",
"defaultValue": "https://<<yourstorageaccountname>>.blob.core.windows.net/?sv=2018-03-28&ss=b&srt=sco&sp=rwdlac&se=2019-10-20T16:33:57Z&st=2019-09-20T08:33:57Z&spr=https&sig=lDrBjD%2BjM2T1XjRW997VPMqDp99ZxVoReyRK0VEX7zQ%3D"
}
},
"type": "AzureBlobStorage",
"typeProperties": {
"sasUri": "@{linkedService().StorageAccountEndpoint}"
}
}}
答案 5 :(得分:0)
您可以使用参数化的链接服务来执行此操作,例如:
{
"name": "AzureBlobStorage1",
"properties": {
"type": "AzureBlobStorage",
"annotations": [],
"parameters": {
"storageAccountName": {
"type": "string"
}
},
"typeProperties": {
"serviceEndpoint": "@{concat('https://',linkedService().storageAccountName,'.blob.core.windows.net')}",
"accountKind": "StorageV2"
}
}
}
此代码仅允许您使用存储帐户名称,但是您可以根据需要使用完整的URL。
然后使用2个参数创建一个数据集:
然后您的数据集将如下所示:
在此示例中,我使用了二进制格式的数据集,但是请选择适合自己的内容。
几乎所有连接器都可以完全参数化,但并非所有人都允许从UI中进行设置;您需要像我一样在JSON中进行操作。
答案 6 :(得分:0)
P.S.--> 我没有处理动态存储帐户名称,但我已经为 ADF 管道中一个数据库帐户中的多个数据库名称动态处理了它。希望有帮助。
Azure 数据工厂中的链接服务可以动态配置为在执行时接受参数值。这些服务在 Azure 中称为参数化链接服务。
您需要在链接服务中将动态/变化的值配置为参数,然后在运行时从配置文件中引用它们的值。可以通过 AzureDatafactory Pipeline 的查找活动来考虑配置文件。
显示了一个动态获取 Cosmos DB 名称的示例参数化链接服务以供参考:这里的 DBName 是在触发管道时将与实际的 DB 名称值一起传递的参数。
{
"name": "ls_name_xyz",
"type": "Microsoft.DataFactory/factories/linkedservices",
"properties": {
"type": "CosmosDbMongoDbApi",
"parameters": {
"DBName": {
"type": "String"
}
},
"annotations": [],
"typeProperties": {
"connectionString": "your_connection_string-xyz",
"database": "@{linkedService().DBName}",
"encryptedCredential": "your_credentials-xyz"
}
}
}