29

我正在使用 Microsoft.WindowsAzure.StorageClient 来操作 Azure 存储上的 blob。我已经到了用户需要列出上传的文件并修改/删除它们的地步。由于一个容器中有很多文件,查询天蓝色存储服务以仅返回所需文件的最佳方法是什么。另外,我希望能够只返回特定数量的 blob,以便实现分页。

CloudBlobContainer 中有一个名为 ListBlobs 的方法,但似乎它正在返回容器中的所有 blob。那对我不起作用。

我在这个主题上搜索了很多,找不到任何有用的东西。此链接仅显示基础知识。

- - - - - 编辑

我在下面的回答不会懒惰地检索 blob,但它会检索容器中的所有 blob,然后过滤结果。目前没有懒惰地检索 blob 的解决方案。

4

8 回答 8

34

ListBlobs方法懒惰地检索该容器中的 blob 。因此,您可以针对该方法编写查询,这些查询在您循环(或使用 ToList 或其他方法实现对象)列表之前不会执行。

举几个例子,事情就会变得更清楚。对于那些不知道如何在 Azure 存储帐户中获取容器引用的人,我推荐本教程

按最后修改日期排序并获取第 2 页(每页 10 个 blob):

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
}
于 2013-01-21T14:14:49.747 回答
20

我对 Windows Azure blob 存储的了解是它是最基本的。就像非常简单的一样。您应该只使用它来存储文档和关联的元数据,然后按 ID 检索单个 blob。

我最近将一个应用程序从 MongoDB 迁移到了 Windows Azure blob 存储。来自 MongoDB,我期待着一堆不同的有效方法来检索文档。迁移后,我现在依靠传统的 RDBMS 和 ElasticSearch 以更易于搜索的方式存储 blob 信息。

Windows Azure blob 存储的限制如此之大真是太糟糕了。我希望将来能看到更多增强的搜索功能(例如,通过元数据、属性、blob 名称正则表达式等进行搜索)。此外,基于 map/reduce 的索引会很棒。如果他们做了这些事情,微软就有机会将很多人从其他文档存储系统转换过来。

于 2013-08-02T03:05:00.213 回答
4

编辑

现在预览版是用于 azure 存储的 blob 索引,它是元数据的托管索引,您可以添加到 blob(新的或现有的)中。这将消除使用创造性容器名称进行伪索引或自己维护二级索引的需要。

原始答案

对于返回特定结果,一种可能的选择是使用 blob 和/或容器前缀来有效地索引您正在存储的内容。例如,您可以在添加 blob 时为日期和时间添加前缀,或者您可以为用户添加前缀,这取决于您希望如何“索引”您的 blob 的用例。然后,您可以在 ListBlobs[Segmented] 调用中使用此前缀或其一部分来返回特定结果,显然您需要首先放置最通用的元素,然后是更具体的元素,例如:

2016_03_15_10_15_blobname

这将允许您在没有多次调用的情况下获得所有 2016 年的 blob,或 2016 年 3 月的 blob 等,但不能在任何一年中获得 3 月的 blob。

这样做的缺点是,如果您需要重新索引 blob,则需要删除并使用新名称重新创建它们。

对于分页,您通常可以使用 ListBlobsSegmented 方法,该方法将为您提供一个可用于实现分页的延续令牌。也就是说,如果您需要跳过页面,它并没有多大用处,因为它只能从最后一组实际结果停止的位置开始工作。一种选择是计算您需要跳过的页面数,获取并丢弃它们,然后获取您想要的实际页面。如果每个容器中有很多 blob,这可能很快就会变得非常低效......

您也可以将其作为故障恢复方法,使用逐页方法并在用户按顺序单击一个页面到下一个页面时存储延续令牌,或者您可能会缓存 blob 名称并从中进行自己的分页。

您还可以将这两种方法结合起来,例如按“索引”过滤,然后对结果进行分页。

于 2016-03-15T15:02:16.937 回答
1

在这里偶然发现除了用于比较的标签之外的其他选项,至少对于 REST api,它似乎现在是内置的。

按标记查找 Blob 操作可查找存储帐户中其标记与给定搜索表达式匹配的所有 Blob。

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

您可以在上传 blob 时添加标签。

于 2021-05-07T01:17:18.773 回答
0

Azure Data Lake Gen 2 将支持使用 USQL 搜索存储在 Data Lake 中的数据。Blob 存储 API 可用于存储和检索该数据。

于 2018-08-14T14:47:36.397 回答
0

U-SQL 当前不支持交互式查询/搜索。

对于我的用例,我计划利用 Azure blob 存储获得低成本优势,并在每个新的 blob 文件创建事件触发 Azure Functions 对 blob 进行数据转换,以将处理后的输出提供给 Azure Cosmos DB 或 RDBMS(支持查询)。

于 2020-08-13T19:32:36.427 回答
0

只需从您的资源配置诊断设置以将文件持久保存在 Log Analytics 工作区中,您应该一切顺利。我知道这篇文章已经很老了,但看起来它仍在为类似问题编入索引。

日志分析

于 2021-03-22T13:29:11.493 回答
0

与此同时,Azure Blob 存储得到了增强以支持索引标记。

引用:使用 blob 索引标记管理和查找 Azure Blob 数据

随着数据集变得越来越大,在海量数据中找到特定对象可能会很困难。Blob 索引标记通过使用键值索引标记属性提供数据管理和发现功能。您可以在存储帐户中的单个容器或所有容器中对对象进行分类和查找。随着数据需求的变化,对象可以通过更新它们的索引标签来动态分类。对象可以保留在其当前容器组织中。

Blob 索引标签可让您:

  • 使用键值索引标签对 Blob 进行动态分类
  • 在整个存储帐户中快速查找特定的标记 Blob
  • 根据索引标签的评估指定 blob API 的条件行为
  • 使用索引标签对 blob 生命周期管理等功能进行高级控制

源代码示例在这里:

使用 blob 索引标记管理和查找 Azure Blob 存储上的数据

于 2021-12-29T16:29:50.620 回答