2017-06-01 3 views
1

1つのAzureストレージアカウントから別のAzureストレージアカウントにブロブコンテナをコピーしようとしています。私はこのためにAzure Data Factoryコピーアクティビティを使用しています。すべてのブロブをコピーするのは簡単です。しかし、私は特定の拡張ブロブだけをコピーしたい。Azureデータファクトリを使用して特定の拡張ブロブのみをコピーする

入力データセットの作成中にwildcardまたはregexを指定するオプションはありません。

ADFでこれを実現する方法はありますか? Azureデータ移動ライブラリも試しました。そのような特徴はありません。 prefixベースのフィルタリングのみがDMLで使用できます。

答えて

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入力データセットでこれが機能しているかどうかはわかりません。 – Venky

+0

Blast!申し訳ありませんがそれを逃した。私はとてもシンプルなものを両者に当てはめると思いました!マイクロソフトの別のユーザーフィードバック投稿を作成する時間:-) –

+0

はい。 ADFには多くの基本機能が欠けています。 'Last Modified'カラムによるインクリメンタルバックアップとブロブタイプによるブロブのフィルタリングがあります。 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)); 
      } 
     } 
関連する問題