2017-06-01 51 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)); 
      } 
     }