Я использую Azure Datastorage Gen2 и столкнулся с проблемой: я не могу создать виртуальный каталог, когда включен параметр иерархического пространства имен.
Если я попытаюсь это сделать
const std::string blobContent= "";
auto blockBlobClient= std::make_shared<Azure::Storage::Blobs::BlockBlobClient>(m_container->GetBlobClient(blobName).AsBlockBlobClient());
std::vector<uint8_t> buffer(blobContent.begin(), blobContent.end());
blockBlobClient->UploadFrom(buffer.data(), buffer.size());
Azure::Storage::Metadata blobMetadata= {{"hdi_isfolder", "true"}};
blockBlobClient->SetMetadata(blobMetadata);
Я получаю сообщение об ошибке *Ошибка: 400 Один из заголовков HTTP, указанных в запросе, не поддерживается. * Но разве это не способ создать виртуальный каталог? Может кто-нибудь объяснить мне, что я делаю неправильно?
Спасибо!
Я попытался создать виртуальный каталог в хранилище BLOB-объектов ADLS Gen2.
Я получил ошибку: 400. Один из HTTP-заголовков, указанных в запросе, не поддерживается.
Я ожидал, что папка создастся без проблем
для создания виртуального каталога в хранилище BLOB-объектов ADLS Gen2.
Вы можете использовать приведенный ниже код для создания каталога в хранилище BLOB-объектов Azure Data Lake Gen2 с помощью C++.
Чтобы создать каталог, вам необходимо установить пакет Azure Datalake gen2, используя команду ниже.
vcpkg install azure-storage-files-datalake-cpp
Код:
#include <cstdio>
#include <iostream>
#include <stdexcept>
#include <azure/storage/files/datalake.hpp>
int main()
{
using namespace Azure::Storage::Files::DataLake;
const std::string fileSystemName = "test";
const std::string directoryName = "sample-directory";
const std::string connectionString = "DefaultEndpointsProtocol=https;AccountName=venkat78901;AccountKey=52ZxzzzEZCvozzzzzzzzzzAStAvgrmA==;EndpointSuffix=core.windows.net";
auto fileSystemClient
= DataLakeFileSystemClient::CreateFromConnectionString(connectionString, fileSystemName);
fileSystemClient.CreateIfNotExists();
// Create a directory.
auto directoryClient = fileSystemClient.GetDirectoryClient(directoryName);
directoryClient.Create();
std::cout << "Directory created: " << directoryName << std::endl;
return 0;
}
Вышеупомянутый выполненный и созданный каталог в моем контейнере.
Выход:
Directory created: sample-directory
Портал:
Это означает, что если включены параметры иерархического пространства имен, создание блока с метаданными с помощью BlobServiceClient не поддерживается? Или он просто не может создать объект с определенными метаданными (зарезервированными словами)?
Приведенный выше пакет предназначен для аутентификации с помощью учетных записей хранения Data Lake 2-го поколения (с включенным иерархическим пространством имен).
Обратитесь к этому адресу Learn.microsoft.com/en-us/dotnet/api/…, чтобы установить метаданные с помощью клиента службы datalake.
Вроде как получилось, но я все равно хочу использовать BlobServiceClient и BlockBlobClient. Есть ли способ прочитать этот заголовок, чтобы проверить, что в нем не поддерживается? Ошибка: 400 Один из HTTP-заголовков, указанных в запросе, не поддерживается. \ Один из HTTP-заголовков, указанных в запросе, не поддерживается. \ RequestId: 1327839e-201e-003a-13bd-ddb25c000000 \ Time: 2024-07-24T11:37:29.9697412Z \ Идентификатор запроса: 1327839e-201e-003a-13bd-ddb25c000000
Да. Используя клиент службы BLOB-объектов, вы не можете создать виртуальный каталог.
Можете ли вы прислать мне документ, где это написано? @Венкатесан
Клиент контейнера не имеет функции создания каталога, вместо этого вы можете создать каталог, загрузив его с именем файла.Learn.microsoft.com/en-us/azure/storage/blobs/…BlobClient blobClient = containerClient.GetBlobClient(<foldername>/file,txt);
Я никогда не пытался это сделать, но чтобы создать большой двоичный объект и добавить к нему определенные метаданные, которые не поддерживаются, и по всем этим ссылкам, которые вы мне прислали, нет официального заявления о добавлении тега метаданных «hdi_isfolder». поддерживается ADLS Gen2 с включенной опцией иерархического пространства имен. Я не виню тебя @Venkatesan, это просто наблюдение. Также я забыл упомянуть, что использую Azure SDK для cpp. Также следует добавить: этот параметр работал с устаревшей библиотекой azure.storage 7.5. А это значит, что он не поддерживает регрессию, верно?
пустой объект + метаданные (hdi_isfolder) = виртуальный каталог? Или я это совсем не так понял?
Да, я так думаю, вы пытались с моим кодом сделать то же самое?
Я попробовал ваш код, но он не работает «из коробки», мне нужно адаптировать URL-адрес к dfs, чтобы проверить, существует ли файловая система... Но он наверняка будет работать, это то же самое, что и пример adls2. Спасибо @Venkatesan В любом случае довольно сложно согласовать все эти «функции» Azure.
Это сработало, пришлось обновить ссылку с blob на dfs, и все работает нормально, спасибо!
Проверьте ответ ниже.