Как запросить облачные BLOB-объекты в хранилище Windows Azure

Я использую Microsoft.WindowsAzure.StorageClient для управления большими двоичными объектами в хранилище Azure. Я дошел до того, что пользователю нужно перечислить загруженные файлы и изменить / удалить их. Поскольку в одном контейнере много файлов, как лучше всего запросить службы хранилища Azure, чтобы они возвращали только нужные файлы. Кроме того, я хотел бы иметь возможность возвращать только определенное количество BLOB-объектов, чтобы можно было реализовать разбиение на страницы.

В CloudBlobContainer есть метод ListBlobs, но похоже, что он возвращает все капли в контейнере. Для меня это не сработает.

Я много искал по этой теме и не нашел ничего полезного. Эта ссылка показывает только основы .

--------- РЕДАКТИРОВАТЬ

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


person Gorgi Rankovski    schedule 21.01.2013    source источник


Ответы (7)


Что я понял о хранилище BLOB-объектов Windows Azure, так это то, что оно простое. Как в чрезвычайно скелете. Вы должны использовать его только для хранения документов и связанных метаданных, а затем для получения отдельных больших двоичных объектов по идентификатору.

Недавно я перенес приложение из MongoDB в хранилище BLOB-объектов Windows Azure. Исходя из MongoDB, я ожидал множества различных эффективных способов извлечения документов. После миграции я теперь полагаюсь на традиционную СУБД и ElasticSearch для хранения информации о больших двоичных объектах в более удобной для поиска форме.

Очень жаль, что хранилище BLOB-объектов Windows Azure настолько ограничено. Я надеюсь увидеть в будущем много-расширенных возможностей поиска (например, поиск по метаданным, свойству, регулярному выражению имени большого двоичного объекта и т. Д.). Кроме того, были бы великолепны индексы на основе map / reduce. У Microsoft есть шанс переубедить многих людей из других систем хранения документов, если они сделают это.

person NathanAldenSr    schedule 02.08.2013
comment
Спасибо @NathanAldenSr. Похоже, этот вопрос приобрел некоторую популярность, поэтому я отметил ваш ответ как правильный. - person Gorgi Rankovski; 30.01.2015

Метод ListBlobs извлекает большие двоичные объекты в этом контейнере лениво. Таким образом, вы можете писать запросы к этому методу, которые не выполняются до тех пор, пока вы не зациклите (или не материализуете объекты с помощью ToList или какого-либо другого метода) список.

Несколько примеров прояснят ситуацию. Для тех, кто не знает, как получить ссылку на контейнер в своей учетной записи хранения Azure, я рекомендую этот руководство.

Закажите по дате последнего изменения и возьмите страницу номер 2 (10 капель на страницу):

blobContainer.ListBlobs().OfType<CloudBlob>()
         .OrderByDescending(b=>b.Properties.LastModified).Skip(10).Take(10);

Получите файлы определенного типа. Это будет работать, если вы установили ContentType во время загрузки (что я настоятельно рекомендую вам сделать):

blobContainer.ListBlobs().OfType<CloudBlob>()
         .Where(b=>b.Properties.ContentType.StartsWith("image"));

Получите файлы .jpg и отсортируйте их по размеру файла, предполагая, что вы задали имена файлов с их расширениями:

blobContainer.ListBlobs().OfType<CloudBlob>()
    .Where(b=>b.Name.EndsWith(".jpg")).OrderByDescending(b=>b.Properties.Length);

Наконец, запрос не будет выполнен, пока вы не сообщите ему:

var blobs = blobContainer.ListBlobs().OfType<CloudBlob>()
                          .Where(b=>b.Properties.ContentType.StartsWith("image"));

foreach(var b in blobs) //This line will call the service, 
                        //execute the query against it and 
                        //return the desired files
{
   // do something with each file. Variable b is of type CloudBlob
}
person Gorgi Rankovski    schedule 21.01.2013
comment
Я протестировал ваш код Gorgi (первый пример), и он по-прежнему извлекает несколько элементов, когда я использую .Skip (1) .Take (1). так что это не похоже на ленивую загрузку - person GeertvdC; 18.07.2013
comment
Хорошо, я дважды проверю это позже и дам тебе знать - person Gorgi Rankovski; 18.07.2013
comment
@GeertvdC Я только что попробовал, работает как положено. Можете наклеить то, что пробовали? - person Gorgi Rankovski; 18.07.2013
comment
Я создал образец, который делает то же самое, что и ваш код, и загрузил здесь: sdrv.ms/12NmaIr it пропустит 1 и возьмет 1 из общего списка BLOB-объектов (то есть 2). но он не загружается лениво, когда вы проверяете скрипт, он по-прежнему перечисляет 2 файла в ответе - person GeertvdC; 19.07.2013
comment
Холли дерьмо, ты прав. В документации для ListBlobs () говорится, что он лениво извлекает капли, но похоже, что вы не можете писать запросы к свойствам: \ Единственное, что вы можете запрашивать, - это префикс имени больших двоичных объектов, например ListBlobs (тест) - возвращает только один файл. - person Gorgi Rankovski; 19.07.2013
comment
Я думаю, что можно что-то сделать с odata, но не понял, как это сделать. - person GeertvdC; 19.07.2013
comment
Привет, Горги, blobContainer.ListBlobs () возвращает IEnumerable, а не IQueryable, в .NET по соглашению IEnumerable используется для первой загрузки всех данных с сервера в память, а затем запроса их в отличие от IQueryable, который анализирует запрос к серверу, и возвращает только действительные reulsts все в ленивом режиме. codeproject.com/Tips/468215/ - person James Roeiter; 24.08.2013
comment
Тот факт, что контейнер лениво извлекает большие двоичные объекты, не означает, что он использует какой-либо расширенный поиск на основе вашего скомпилированного запроса LINQ. Скорее всего, он просто переходит от большого двоичного объекта к другому, выполняя ваш запрос после получения каждого из них. - person NathanAldenSr; 13.11.2013
comment
Лениво означает, что он будет загружать содержимое при первом использовании (не во время использования ListBlobs). Это не означает, что он будет перечислять только ту часть, которую вы запросили в своем пропуске / дубле. Он загрузит все капли, а затем применит пропуск / дубль. Для более умного пропуска / приема требуется интерфейс IQueryable - person cellik; 17.12.2015
comment
Вы также можете выполнить фильтрацию по типу файла dev.to/williamxifaras / - person William Xifaras; 05.04.2019

Редактировать

Теперь в предварительной версии индекс BLOB-объектов для хранилища Azure, который представляет собой управляемый индекс метаданных, которые вы можете добавить в свои BLOB-объекты (новые или существующие). Это избавит от необходимости использовать имена творческих контейнеров для псевдоиндексирования или самостоятельно поддерживать вторичный индекс.

Оригинальный ответ

Для возврата конкретных результатов одним из возможных вариантов является использование префикса blob и / или контейнера для эффективного индексирования того, что вы храните. Например, вы можете префикс даты и времени при добавлении BLOB-объектов или префикса пользователя, в зависимости от вашего варианта использования, как вы хотите проиндексировать свои BLOB-объекты. Затем вы можете использовать этот префикс или его часть в вызове ListBlobs [Segmented] для возврата конкретных результатов, очевидно, вам нужно сначала поместить самые общие элементы, а затем более конкретные элементы, например:

2016_03_15_10_15_blobname

Это позволит вам получать все капли за 2016 год или за мартовские 2016 года и т. Д., Но не за мартовские капли в любой год без нескольких вызовов.

Обратной стороной этого является то, что если вам нужно повторно проиндексировать большие двоичные объекты, вам придется удалить и воссоздать их с новым именем.

Для разбиения на страницы обычно можно использовать метод ListBlobsSegmented, который даст вам токен продолжения, который можно использовать для реализации разбиения на страницы. Тем не менее, это не очень полезно, если вам нужно пропускать страницы, поскольку он работает только с того места, где остановился последний набор фактических результатов. Один из вариантов - рассчитать количество страниц, которые вам нужно пропустить, получить их и отбросить, а затем получить фактическую страницу, которую вы хотите. Если у вас много капель в каждом контейнере, это может довольно быстро стать неэффективным ...

Вы также можете использовать это как метод восстановления после сбоя, используя постраничный подход и сохраняя токен продолжения, если пользователь последовательно щелкает одну страницу на следующую, ИЛИ вы можете потенциально кэшировать имена больших двоичных объектов и выполнять свою собственную разбивку по страницам.

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

person Matt    schedule 15.03.2016
comment
знаете ли вы какую-либо информацию о том, насколько быстро выполняется запрос по префиксу? он проиндексирован или сканирует весь контейнер? - person Andy; 11.04.2020
comment
@Andy отредактировал ответ, добавив полезные ссылки. - person Matt; 11.04.2020
comment
все эти документы специально говорят о хранении таблиц. Вы нашли что-нибудь похожее на хранилище BLOB-объектов? В частности, если у меня есть миллион больших двоичных объектов в контейнере, и я хочу найти 10 из них с помощью префиксного запроса, потребуется ли для этого полное сканирование? - person Andy; 14.04.2020
comment
Извините, я даже не перечитал свой исходный ответ перед его редактированием, я думал, что мы говорим о хранилище таблиц! Единственное, что мне известно о производительности хранилища BLOB-объектов: 1) будьте осторожны при выборе раздел и создание имен контейнеров / больших двоичных объектов или 2) оплата высокопроизводительное хранилище. Третий вариант - индексировать имена контейнеров или больших двоичных объектов отдельно в выбранном вами хранилище данных. - person Matt; 14.04.2020
comment
@Andy - Ознакомьтесь с моими изменениями, только что было объявлено о новой функции управляемого индекса. - person Matt; 06.05.2020

Azure Data Lake Gen 2 будет поддерживать поиск данных, хранящихся в озере данных, с помощью USQL. Для хранения и извлечения этих данных можно использовать API-интерфейсы хранилища BLOB-объектов.

person Jason Steele    schedule 14.08.2018

U-SQL в настоящее время не поддерживает интерактивные запросы / поиск.

Для моего варианта использования я планирую использовать хранилище BLOB-объектов Azure для получения преимущества с низкой стоимостью и для каждого нового события создания файла BLOB-объекта запускать функции Azure для преобразования данных в большом двоичном объекте для передачи обработанных выходных данных в Azure Cosmos DB или RDBMS (которая поддерживает запросы ).

person Santhosh    schedule 13.08.2020

Просто настройте параметры диагностики из своего ресурса, чтобы файлы сохранялись в рабочей области Log Analytics, и все будет в порядке. Я знаю, что этот пост довольно старый, но похоже, что он все еще индексируется по аналогичным вопросам.

Журнал аналитики

person cavok    schedule 22.03.2021

Наткнулся здесь, ища другие варианты, кроме тегов для сравнения, и, по крайней мере, с REST api, похоже, он теперь встроен.

Операция «Найти большие двоичные объекты по тегам» находит все большие двоичные объекты в учетной записи хранения, теги которых соответствуют заданному поисковому выражению.

https://docs.microsoft.com/en-us/rest/api/storageservices/find-blobs-by-tags

Вы можете добавлять теги при загрузке большого двоичного объекта.

person Clocker    schedule 07.05.2021