Как найти соответствующие данные в последнем файле, используя поиск Azure в контейнере BLOB-объектов C # - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть контейнер Azure BLOB с именем dataTest, внутри которого есть multiple folders created based on year/ month / date.

dataTest/rawjson/2019/01/25/01/demo1.json

dataTest/rawjson/2018/12/30/02/demo2.json

. Я хочу получить файл по последнему пути к папке:

dataTest/rawjson/2019/01/25/01/demo1.json

Какполучить последний путь (dataTest/rawjson/2019/01/25/01/demo1.json)

, когда я передаю ввод как dataTest/rawjson

Я хочу читать данные, используя azure search, нам нужно создать index, импортировав этот BLOB-объектКонтейнер.

Интересно, есть ли способ динамически передать этот путь BLOB-объекта и получить последние данные файла, используя azure search?

до того, как azure search я использовал приведенный ниже код C # для получения последнейфайл

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference("dataTest");

            string directoryreference = "dataTest/rawjson/events";

            var blobDirectory = container.GetDirectoryReference(directoryreference);
            IEnumerable<IListBlobItem> items = blobDirectory.ListBlobs(useFlatBlobListing: true);

            string blobFilePath = String.Empty;
            foreach (var blob in items.OfType<CloudBlob>()

    .OrderByDescending(b => b.Properties.LastModified))
            {
                string blobFileFullPath = Path.GetDirectoryName(blob.Name).Replace("\\", "/");
                blobFilePath = Path.GetDirectoryName(blobFileFullPath).Replace("\\", "/");
                if (blobFilePath != null)
                { break; }

            }
            var blobFileDirectory = container.GetDirectoryReference(blobFilePath);
            IEnumerable<IListBlobItem> fileitems = blobFileDirectory.ListBlobs(useFlatBlobListing: true);

1 Ответ

0 голосов
/ 07 марта 2019

В BLOB-объектах нет физической папки, «папка» является лишь частью пути к BLOB-объекту..Each IListBlobItem будет CloudBlockBlob, CloudPageBlob или CloudBlobDirectory.

После приведения к блочному блоку или блобу страницы или их общего базового класса CloudBlob (предпочтительно с использованием ключевого слова as и проверкой на нулевое значение),Вы можете получить доступ к измененной дате через blockBlob.Properties.LastModified.

Обратите внимание, что ваша реализация выполнит O (n) сканирование всех BLOB-объектов в контейнере, что может занять некоторое время, если существуют сотни тысячфайлы.Однако в настоящее время нет способа сделать более эффективный запрос хранилища больших двоичных объектов (если только вы не злоупотребите именованием файлов и не закодируете дату таким образом, чтобы более новые даты были в алфавитном порядке первыми).Реально, если вам нужна лучшая производительность запросов, я бы порекомендовал иметь под рукой таблицу базы данных, которая представляет все списки файлов в виде строк, с такими вещами, как индексированный столбец DateModified для поиска и столбец с путем BLOB-объекта для быстрого доступа к файлу.

Лучше было бы использовать хранилище таблиц Azure вместе с хранилищем больших двоичных объектов.При таком подходе при создании большого двоичного объекта вы записываете запись в хранилище таблиц Azure.Также, когда большой двоичный объект обновляется, вы делаете еще одну запись в хранилище таблиц Azure.Это вы сможете создать контрольный журнал.

Если вы заинтересованы в ведении истории больших двоичных объектов (например, пользователь загрузил текстовый файл, а затем загрузил другой текстовый файл, и вы хотите отслеживатьоба текстовых файла), затем вы можете сделать снимок большого двоичного объекта до его обновления.Что он будет делать, это создать копию только для чтения существующего большого двоичного объекта.Когда создается снимок, процесс возвращает вам значение даты / времени, которое вы можете сохранить вместе с обновленной записью в хранилище таблиц.

...