我正在尝试将一个blob容器从一个Azure存储帐户复制到另一个。我正在使用Azure Data Factory
复制活动来做到这一点。复制所有斑点很容易。但是我只想复制特定的扩展斑点。
在创建输入数据集时,我看不到指定wildcard
或regex
的任何选项。
有什么方法可以通过ADF实现这一目标。我还尝试了Azure数据运动库。即使没有这种功能。DML中只有基于prefix
的过滤。
在数据集定义中使用 filefilter 属性来处理此操作。例如。
{
"name": "Dataset01",
"properties": {
"type": "AzureBlob",
"linkedServiceName": "BlobStore01",
"structure": [ ],
"typeProperties": {
"folderPath": "FilesFolder1/FilesFolder2",
"fileFilter": "*.csv" // <<<<< here
}
//etc...
}
//etc...
}
这同时使用 *和?。
更多信息作为此文档页面的一部分:
https://learn.microsoft.com/en-us/azure/data-factory/data-factory-onprem-onprem-file-system-connector
希望这会有所帮助。
基于我的理解,Blob没有文件扩展概念。当我们在本地计算机上下载这些文件时,文件扩展程序将非常方便。基于文件扩展名,我们的本地计算机可以决定用于打开这些文件的应用程序。
有什么办法可以通过ADF
实现这一目标
我们可以使用Azure数据工厂自定义活动来做到这一点。我们可以自己实施逻辑。有关如何使用自定义活动的更多信息,请参阅本教程。
我们还可以使用Azure WebJob和Time触发来做到这一点。
如果Azure Data Factory是唯一的选择,我们可以使用逻辑实现复制斑点。以下是我的演示代码。我在我身边进行了测试,它可以正常工作
CloudStorageAccount storageAccountSource = CloudStorageAccount.Parse("connection string");
CloudStorageAccount storageAccountDest = CloudStorageAccount.Parse("connection string");
// Create the blob client.
CloudBlobClient blobClientSource = storageAccountSource.CreateCloudBlobClient();
CloudBlobClient blobClientDest = storageAccountDest.CreateCloudBlobClient();
CloudBlobContainer containerSource = blobClientSource.GetContainerReference("test");
CloudBlobContainer containerDest = blobClientDest.GetContainerReference("test");
containerDest.CreateIfNotExists();
SharedAccessBlobPolicy sharedPolicy = new SharedAccessBlobPolicy()
{
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24),
Permissions = SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.List |
SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Create | SharedAccessBlobPermissions.Delete
};
// Get the container's existing permissions.
BlobContainerPermissions permissions = containerSource.GetPermissions();
permissions.SharedAccessPolicies.Add("policy", sharedPolicy);
containerSource.SetPermissionsAsync(permissions);
var blobToken = containerSource.GetSharedAccessSignature(sharedPolicy);
foreach (IListBlobItem item in containerSource.ListBlobs())
{
CloudBlob destBlob;
CloudBlob srcBlob;
if (item.GetType() == typeof(CloudBlockBlob))
{
srcBlob = (CloudBlockBlob)item;
destBlob = containerDest.GetBlockBlobReference(srcBlob.Name);
}
else
{
srcBlob = (CloudPageBlob)item;
destBlob = containerDest.GetPageBlobReference(srcBlob.Name);
}
if (srcBlob.Name.Contains("format"))
{
destBlob.StartCopy(new Uri(srcBlob.Uri.AbsoluteUri + blobToken));
}
}