我已经看到了关于SO的各种问题,关于如何获得Azure存储表的总行数,但是我想知道如何获得单个分区内的行数。在将 * 最小 * 量的实体数据加载到内存中时,我如何做到这一点?
hm2xizp91#
你可能已经知道Azure表中没有Count之类的功能。为了获取分区(或表)中的实体(行)总数,你必须获取所有实体。您可以使用一种称为Query Projection的技术来减少响应负载。查询投影允许您指定希望表服务返回的实体属性(列)的列表。由于您只对实体的总数感兴趣,我建议您只取回PartitionKey。您可能会发现这篇博客文章有助于理解查询投影:https://blogs.msdn.microsoft.com/windowsazurestorage/2011/09/15/windows-azure-tables-introducing-upsert-and-query-projection/.
Count
Query Projection
PartitionKey
fnx2tebb2#
https://azure.microsoft.com/en-gb/features/storage-explorer/允许您定义查询,并且可以使用表统计数据工具栏项获取整个表或查询的总行数
vnjpjtjt3#
使用秒表测试了在一个分区中提取和计数100,000个实体的速度,该分区除标准TableEntity外还有三个字段。我只选择了PartitionKey,并使用解析器得到一个字符串列表,一旦检索到整个分区,我就开始计数。我得到的最快速度是6000ms-6500ms左右。函数如下:
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; }
这是一个通用函数,您所需要的只是tableName和partitionKey。
tableName
partitionKey
byqmnocz4#
您可以通过高效地利用Azure表存储服务的原子批处理操作来实现这一点。对于每个分区,都有一个具有相同分区键和特定行键(如“PartitionCount”等)的附加实体。该实体将具有单个int(或long)属性Count。每次插入新实体时,执行一个原子批处理操作以同时递增分区计数器实体的Count属性。分区计数器实体将与数据实体具有相同的分区键,以便允许您执行原子批处理操作,并保证一致性。每次删除一个实体时,都要递减分区计数器实体的Count属性。再次以批处理方式执行操作,以使这两个操作保持一致。如果您只想读取分区计数的值,那么您所需要做的就是对分区计数器实体进行单点查询,它的Count属性将告诉您该分区的当前计数。
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。
results.CountAsync()
System.Linq.Async
ogsagwnx6#
我认为你可以直接在C#中使用.Count。你可以使用以下两种技术之一:
.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总行数,具体取决于查询。
count
6条答案
按热度按时间hm2xizp91#
你可能已经知道Azure表中没有
Count
之类的功能。为了获取分区(或表)中的实体(行)总数,你必须获取所有实体。您可以使用一种称为
Query Projection
的技术来减少响应负载。查询投影允许您指定希望表服务返回的实体属性(列)的列表。由于您只对实体的总数感兴趣,我建议您只取回PartitionKey
。您可能会发现这篇博客文章有助于理解查询投影:https://blogs.msdn.microsoft.com/windowsazurestorage/2011/09/15/windows-azure-tables-introducing-upsert-and-query-projection/.fnx2tebb2#
https://azure.microsoft.com/en-gb/features/storage-explorer/允许您定义查询,并且可以使用表统计数据工具栏项获取整个表或查询的总行数
vnjpjtjt3#
使用秒表测试了在一个分区中提取和计数100,000个实体的速度,该分区除标准TableEntity外还有三个字段。
我只选择了PartitionKey,并使用解析器得到一个字符串列表,一旦检索到整个分区,我就开始计数。
我得到的最快速度是
6000ms
-6500ms
左右。函数如下:这是一个通用函数,您所需要的只是
tableName
和partitionKey
。byqmnocz4#
您可以通过高效地利用Azure表存储服务的原子批处理操作来实现这一点。对于每个分区,都有一个具有相同分区键和特定行键(如“PartitionCount”等)的附加实体。该实体将具有单个int(或long)属性Count。
每次插入新实体时,执行一个原子批处理操作以同时递增分区计数器实体的Count属性。分区计数器实体将与数据实体具有相同的分区键,以便允许您执行原子批处理操作,并保证一致性。
每次删除一个实体时,都要递减分区计数器实体的Count属性。再次以批处理方式执行操作,以使这两个操作保持一致。
如果您只想读取分区计数的值,那么您所需要做的就是对分区计数器实体进行单点查询,它的Count属性将告诉您该分区的当前计数。
wkyowqbh5#
这可以做得比@NickBrooks回答短一点。
results.CountAsync()
来源于System.Linq.Async
,一个由dotnet官方支持的NuGet package。ogsagwnx6#
我认为你可以直接在C#中使用
.Count
。你可以使用以下两种技术之一:或
count
变量将具有number总行数,具体取决于查询。