【问题标题】:How to query Cloud Blobs on Windows Azure Storage如何在 Windows Azure 存储上查询云 Blob
【发布时间】:2013-01-21 14:14:49
【问题描述】:

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

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

我在这个主题上搜索了很多,但找不到任何有用的东西。这个link 只展示了基础知识。

--------- 编辑

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

【问题讨论】:

    标签: .net linq lazy-loading azure-blob-storage azure-sdk-.net


    【解决方案1】:

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

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

    按最后修改日期排序并取第 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
    }
    

    【讨论】:

    • 我已经测试了您的代码 Gorgi(第一个示例),当我使用 .Skip(1).Take(1) 时,它仍然会检索多个项目。所以它似乎没有延迟加载
    • 好的,我稍后再检查一下,我会告诉你的
    • @GeertvdC 我刚试过,按预期工作。您可以粘贴您尝试过的内容吗?
    • 冬青,你是对的。在 ListBlobs() 的文档中,它说它懒惰地检索 blob,但看起来您无法在属性上编写查询:\ 您唯一可以查询的是 blob 的名称前缀 - 例如 ListBlobs ("test") - 这只会返回一个文件。
    • Hello Gorgi,blobContainer.ListBlobs() 返回一个 IEnumerable 而不是 IQueryable ,在 .NET 中按照约定 IEnumerable 用于首先将所有数据从服务器加载到内存,然后查询它与 IQueryable 相反将查询解析到服务器,并在惰性模式下仅返回有效结果。 codeproject.com/Tips/468215/…
    【解决方案2】:

    我对 Windows Azure blob 存储的了解是它是准系统。就像在非常中一​​样。您应该只使用它来存储文档和相关元数据,然后按 ID 检索单个 blob。

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

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

    【讨论】:

    • 感谢@NathanAldenSr。看起来这个问题很受欢迎,所以我将您的答案标记为正确的。
    【解决方案3】:

    编辑

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

    原答案

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

    2016_03_15_10_15_blobname
    

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

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

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

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

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

    【讨论】:

    • 你知道前缀查询有多快吗?它是索引还是扫描整个容器?
    • @Andy 用一些有用的链接编辑了答案。
    • 所有这些文档都专门讨论了表存储。你有没有发现任何类似的关于 blob 存储的东西?具体来说,如果容器中有 100 万个 blob,并且我想通过前缀查询找到其中的 10 个,这是否需要全面扫描?
    • 抱歉,在编辑之前我什至没有重新阅读我的原始答案,我以为我们在谈论表存储!我对 blob 存储性能的唯一了解是 1) 小心partition 和设计容器/blob 名称的方式,或者 2) 为 high performance storage 付费。第三种选择是在您选择的数据存储中分别索引容器或 blob 名称。
    • @Andy - 查看我的编辑,刚刚宣布了一项新的托管索引功能。
    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

          Log analytics

          【讨论】:

            【解决方案8】:

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

            引用:Manage and find Azure Blob data with blob index tags

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

            Blob 索引标签让你:

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

            这里的源代码示例:

            Use blob index tags to manage and find data on Azure Blob Storage

            【讨论】:

              猜你喜欢
              • 2016-02-05
              • 2021-12-31
              • 1970-01-01
              • 1970-01-01
              • 2014-09-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-04-25
              相关资源
              最近更新 更多