Копирование только определенных больших двоичных объектов расширения с помощью фабрики данных Azure

Я пытаюсь скопировать контейнер больших двоичных объектов из одной учетной записи хранилища Azure в другую. Для этого я использую Azure Data Factory Copy Activity. Скопировать все капли просто. Но я хочу копировать только определенные расширения.

Я не вижу возможности указать wildcard или regex при создании набора входных данных.

Есть ли способ добиться этого с помощью ADF. Я также попробовал библиотеку перемещения данных Azure. Даже у него нет такой возможности. В DML доступна только фильтрация на основе prefix.


person Venky    schedule 01.06.2017    source источник


Ответы (2)


Для этого в определении набора данных используйте атрибут 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

Надеюсь это поможет.

person Paul Andrew    schedule 02.06.2017
comment
Приятно знать, что такой фильтр существует. Но в статье, которой вы поделились, упоминается Note that fileFilter is applicable for an input FileShare dataset. Не уверен, что это работает для набора данных Blob Input. - person Venky; 02.06.2017
comment
Взрыв! Извините, что пропустил. Я предположил, что что-то столь простое применимо к обоим! Пришло время создать еще один пост с отзывами пользователей для Microsoft :-) - person Paul Andrew; 02.06.2017
comment
да. У АПД отсутствует так много основных функций. например, инкрементное резервное копирование с Last Modified столбцом и фильтрация больших двоичных объектов по типу большого двоичного объекта. Azure DML - лучшее решение для хранилища BLOB-объектов на данный момент. - person Venky; 02.06.2017

Насколько я понимаю, для blob не существует концепции расширения файла. Расширение файла будет удобно, когда мы загрузим эти файлы на локальный компьютер. В зависимости от расширения файла наш локальный компьютер может решить, какое приложение использовать для открытия этих файлов.

Есть ли способ добиться этого с помощью ADF

Для этого мы можем использовать настраиваемые действия фабрики данных Azure. Мы могли бы реализовать нашу логику самостоятельно. Дополнительную информацию о том, как использовать настраиваемые действия, см. В этом учебные пособия.

Мы также могли бы использовать Azure WebJob с триггером времени для этого.

Если фабрика данных Azure - единственный выбор, мы могли бы реализовать копию большого двоичного объекта с помощью нашей логики. Ниже приведен мой демонстрационный код. Тестировал на своей стороне, работает корректно

         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));
            }
       }
person Tom Sun - MSFT    schedule 06.06.2017