2017-06-01 100 views
1

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

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

有没有什么办法可以通过ADF实现这一点。我也尝试了Azure Data Movement Library。即使它没有这样的功能。 DML仅提供基于prefix的过滤。

回答

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

希望这有助于。

+0

很高兴知道这样的过滤器存在。但是您分享的文章提到了'请注意fileFilter适用于输入的FileShare数据集'。不确定这是否适用于Blob Input数据集。 – Venky

+0

爆炸!对不起,错过了。我假设了一些如此简单的东西适用于两者!现在可以为Microsoft创建另一个用户反馈信息:-) –

+0

是的。 ADF缺乏如此多的基本功能。例如使用“上次修改”列进行增量备份,并通过Blob Type进行Blob筛选。 Azure DML现在是Blob存储的最佳解决方案。 – Venky

0

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

有什么办法,我可以使用ADF

我们可以使用Azure的数据工厂定制活动,要做到这一点实现这一目标。我们可以自己实现我们的逻辑。有关如何使用自定义活动的更多信息,请参阅此tutorials

我们也可以使用带时间触发的Azure WebJob来做到这一点。

如果Azure Data Factory是唯一的选择,我们可以用我们的逻辑来实现复制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)); 
      } 
     }