计算Azure表存储中分区内的行数

mwkjh3gx  于 2022-12-30  发布在  其他
关注(0)|答案(6)|浏览(115)

我已经看到了关于SO的各种问题,关于如何获得Azure存储表的行数,但是我想知道如何获得单个分区内的行数。
在将 * 最小 * 量的实体数据加载到内存中时,我如何做到这一点?

hm2xizp9

hm2xizp91#

你可能已经知道Azure表中没有Count之类的功能。为了获取分区(或表)中的实体(行)总数,你必须获取所有实体。
您可以使用一种称为Query Projection的技术来减少响应负载。查询投影允许您指定希望表服务返回的实体属性(列)的列表。由于您只对实体的总数感兴趣,我建议您只取回PartitionKey。您可能会发现这篇博客文章有助于理解查询投影:https://blogs.msdn.microsoft.com/windowsazurestorage/2011/09/15/windows-azure-tables-introducing-upsert-and-query-projection/.

fnx2tebb

fnx2tebb2#

https://azure.microsoft.com/en-gb/features/storage-explorer/允许您定义查询,并且可以使用表统计数据工具栏项获取整个表或查询的总行数

vnjpjtjt

vnjpjtjt3#

使用秒表测试了在一个分区中提取和计数100,000个实体的速度,该分区除标准TableEntity外还有三个字段。
我只选择了PartitionKey,并使用解析器得到一个字符串列表,一旦检索到整个分区,我就开始计数。
我得到的最快速度是6000ms-6500ms左右。函数如下:

public static async Task<int> GetCountOfEntitiesInPartition(string tableName, string partitionKey)
    {
        CloudTable table = tableClient.GetTableReference(tableName);

        TableQuery<DynamicTableEntity> tableQuery = new TableQuery<DynamicTableEntity>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey)).Select(new string[] { "PartitionKey" });

        EntityResolver<string> resolver = (pk, rk, ts, props, etag) => props.ContainsKey("PartitionKey") ? props["PartitionKey"].StringValue : null;

        List<string> entities = new List<string>();

        TableContinuationToken continuationToken = null;
        do
        {
            TableQuerySegment<string> tableQueryResult =
                await table.ExecuteQuerySegmentedAsync(tableQuery, resolver, continuationToken);

            continuationToken = tableQueryResult.ContinuationToken;

            entities.AddRange(tableQueryResult.Results);
        } while (continuationToken != null);

        return entities.Count;
    }

这是一个通用函数,您所需要的只是tableNamepartitionKey

byqmnocz

byqmnocz4#

您可以通过高效地利用Azure表存储服务的原子批处理操作来实现这一点。对于每个分区,都有一个具有相同分区键和特定行键(如“PartitionCount”等)的附加实体。该实体将具有单个int(或long)属性Count。
每次插入新实体时,执行一个原子批处理操作以同时递增分区计数器实体的Count属性。分区计数器实体将与数据实体具有相同的分区键,以便允许您执行原子批处理操作,并保证一致性。
每次删除一个实体时,都要递减分区计数器实体的Count属性。再次以批处理方式执行操作,以使这两个操作保持一致。
如果您只想读取分区计数的值,那么您所需要做的就是对分区计数器实体进行单点查询,它的Count属性将告诉您该分区的当前计数。

wkyowqbh

wkyowqbh5#

这可以做得比@NickBrooks回答短一点。

public static async Task<int> GetCountOfEntitiesInPartition<T>(string tableName, string partitionKey) where T : ITableEntity, new()
{
    var tableClient = tableServiceClient.GetTableClient(tableName);
    var results = _tableClient.QueryAsync<T>(t => t.PartitionKey == partitionKey,
        select: new[] { "PartitionKey" });
    return await results.CountAsync();    
}

results.CountAsync()来源于System.Linq.Async,一个由dotnet官方支持的NuGet package

ogsagwnx

ogsagwnx6#

我认为你可以直接在C#中使用.Count。你可以使用以下两种技术之一:

var tableStorageData = await table.ExecuteQuerySegmentedAsync(azQuery, null);
int count = tableStorageData.Count();

TableQuery<UserDetails> tableQuery = new TableQuery<UserDetails>();
var tableStorageData = table.ExecuteQuery(tableQuery,null);          
count = tableStorageData .Count();

count变量将具有number总行数,具体取决于查询。

相关问题