Azure Blobs C#客户端-在服务器端使用多个过滤器

Azure Blobs C#客户端-在服务器端使用多个过滤器,azure,.net-core,blob,azure-storage,azure-storage-blobs,Azure,.net Core,Blob,Azure Storage,Azure Storage Blobs,我试图加载blob名称以便在我的程序中进行过滤,然后在应用所有过滤器之后,我计划下载并处理每个blob。 目前,我们有大约30000个存储在容器中的水滴,如下所示: 年/月/日/小时/file.csv(或file.json用于未处理的文件) 我的程序需要动态输入下载的开始和结束日期(最长30天)。通过使用Azure.Storage.Blobs.BlobContainerItem和方法GetBlobs,我可以使用单个字符串前缀进行服务器端筛选 如果我的日期是2020/06/01和2020/06/0

我试图加载blob名称以便在我的程序中进行过滤,然后在应用所有过滤器之后,我计划下载并处理每个blob。 目前,我们有大约30000个存储在容器中的水滴,如下所示: 年/月/日/小时/file.csv(或file.json用于未处理的文件)

我的程序需要动态输入下载的开始和结束日期(最长30天)。通过使用Azure.Storage.Blobs.BlobContainerItem和方法GetBlobs,我可以使用单个字符串前缀进行服务器端筛选

如果我的日期是2020/06/01和2020/06/02,那么这个程序运行得非常快,大约需要2秒钟才能得到斑点并对其应用其余的过滤器。然而,如果我有2020/05/30和2020/06/01,那么我就无法输入月份前缀,因为它只需要1个字符串,所以我的前缀将是2020,这大约需要15秒才能完成。其余的过滤在本地完成,但最大的延迟是GetBlobs()函数

是否有其他方法从.NETCore应用程序在服务器端使用多个筛选器

以下是相关功能:

        BlobContainerClient container = new BlobContainerClient(resourceGroup.Blob, resourceGroup.BlobContainer);
        var blobs = container.GetBlobs(prefix : CreateBlobPrefix(start, end))
            .Select(item=> item.Name)
            .ToList();
        blobs = FilterBlobList(blobs, filter, start, end);

    private string CreateBlobPrefix(DateTime start, DateTime end)
    {
        string prefix = null;
        bool sameYear = start.Year == end.Year;
        bool sameMonth = start.Month == end.Month;
        bool sameDay = start.Day == end.Day;
        if (sameYear)
        {
            prefix = start.Year.ToString();
            if (sameMonth)
            {
                if(start.Month<10)
                    prefix += "/0" + start.Month.ToString();
                else
                    prefix += "/" + start.Month.ToString();
                if (sameDay) 
                    if(start.Day<10)
                        prefix += "/0" + start.Day.ToString();
                    else
                        prefix += "/" + start.Day.ToString();
            }
        }
        return prefix;

您可以多次筛选,以查找日期之间的公约数:

首先按起始月份和年份(2020/05)使用字符串前缀进行筛选,然后在本地筛选精确日期

然后可以逐渐增加日/月过滤器,直到达到范围的末尾

步骤的粒度实际上取决于为给定的平均结果数调用Azure所需的时间。 另一个优点是可以并行运行这些子查询

我使用了以下代码:

var prefixDateFilters=Enumerable.Range(0,1+endDateInclusive.Subtract(startDateInclusive).Days)
.Select(offset=>startDateInclusive.AddDays(offset))
.Select(date=>$“{date.ToString(BlobFileDateTimeFormat)}”).ToList();
prefixFilters.AsParallel()
.Select(filter=>containerClient.GetBlobs(前缀:filter))

这个问题怎么样?下面的答案是否解决了您的问题,如果是,您可以接受它作为一个答案,这样它可以帮助其他社区成员获得相同的问题,我们可以存档此线程,谢谢。我有点忘记了在阅读您的答案后重新访问页面。是的,它帮助我找到了和你写的类似的好方法。谢谢,我已经添加了我使用的代码,但是请分享你的!您是否介意添加CreateBlobPrefix的实现(开始,结束)?
        foreach (var blobPrefix in CreateBlobPrefix(start, end))
        {
            var currentList = container.GetBlobs(prefix: blobPrefix)
                .Select(item => item.Name)
                .ToList();
            blobs = blobs.Concat(currentList).ToList();
        }