使用Azure Data Factory仅复制特定扩展blob

时间:2017-06-01 11:30:10

标签: azure azure-data-factory azure-blob-storage

我正在尝试将Blob容器从一个Azure存储帐户复制到另一个帐户。我正在使用Azure Data Factory复制活动来执行此操作。复制所有blob很简单。但我只想复制特定的扩展blob。

在创建输入数据集时,我没有看到任何指定wildcardregex的选项。

有什么办法可以用ADF实现这一目标。我还尝试了Azure数据移动库。即使它没有这样的功能。 DML中仅提供基于prefix的过滤。

2 个答案:

答案 0 :(得分:0)

在数据集定义中,使用 FileFilter 属性来处理此问题。例如。

{
  "name": "Dataset01",
  "properties": {
    "type": "AzureBlob",
    "linkedServiceName": "BlobStore01",
    "structure": [ ],
    "typeProperties": {
      "folderPath": "FilesFolder1/FilesFolder2",
      "fileFilter": "*.csv" // <<<<< here
      }
      //etc...
     }
     //etc...
    }

使用*和?。

接受多个和单个字符的通配符

更多信息,作为此文档页面的一部分:

https://docs.microsoft.com/en-us/azure/data-factory/data-factory-onprem-file-system-connector

希望这有帮助。

答案 1 :(得分:0)

根据我的理解,blob没有文件扩展名概念。当我们在本地计算机上下载这些文件时,文件扩展名将会很方便。根据文件扩展名,我们的本地计算机可以决定使用哪个应用程序来打开这些文件。

  

有什么方法可以用ADF实现这个目的

我们可以使用Azure Data Factory Custom活动来执行此操作。我们可以自己实现我们的逻辑。有关如何使用自定义活动的详细信息,请参阅此tutorials

我们也可以使用带有时间触发器的Azure WebJob来执行此操作。

如果Azure Data Factory是唯一的选择,我们可以使用我们的逻辑实现copy blob。以下是我的演示代码。我测试了它,它正常工作

         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));
            }
       }