目前,我正在使用PartitionKey来区分将数据存储到Azure Table服务中的设备。 我想构建一个查看器,允许我浏览这些数据,但是如果能够按“设备”或PartitionKey结构化数据以便查看将会很好。 查看器应用程序不知道存在哪些设备,因此如果我能以某种方式返回给定表中不同PartitionKeys的列表,那将非常好。这是可能的吗?还是我只能创建一个元数据表,在其中为每个设备插入一行,然后用于查询?
目前,我正在使用PartitionKey来区分将数据存储到Azure Table服务中的设备。 我想构建一个查看器,允许我浏览这些数据,但是如果能够按“设备”或PartitionKey结构化数据以便查看将会很好。 查看器应用程序不知道存在哪些设备,因此如果我能以某种方式返回给定表中不同PartitionKeys的列表,那将非常好。这是可能的吗?还是我只能创建一个元数据表,在其中为每个设备插入一行,然后用于查询?
public class PartitionEntry : TableServiceEntity { }
tableServiceContext.AddObject("TablePartitions", new PartitionEntry
{
PartitionKey = "<table name>",
RowKey = "<partition key>",
});
tableServiceContext.BeginSaveChanges(SaveChangesOptions.ContinueOnError, null, null);
然后只需查询此表以获取分区列表。对我来说非常易于管理。
var tbl = tableServiceContext.CreateQuery<PartitionEntry>("TablePartitions");
return tbl.Where(i => i.PartitionKey == "<table name>")
.Select(i => new { PartitionKey = i.RowKey, });
我敢打赌这可以被优化。
我之前尝试过类似的方法:
TableQuery queryRows = new TableQuery() { SelectColumns = new List<string> { "PartitionKey" } };
...
var tableClientSrc = storageAcctScr.CreateCloudTableClient();
var tablesSrc = tableClientSrc.ListTables();
var tableSrc = tablesSrc.FirstOrDefault(o => o.Name.Equals(nameSrc));
int cntSrc = tableSrc.ExecuteQuery(queryRows).Count();
...
在大型表(约7000万行)或中等但具有许多属性的表上,您和您的工作速度非常慢。
以下代码将返回表中所有分区键的列表:
ConcurrentDictionary<string, byte> partitionKeys = new ConcurrentDictionary<string, byte>();
Parallel.ForEach(myTable.ExecuteQuery(new TableQuery()), entity =>
{
partitionKeys.TryAdd(entity.PartitionKey, 0);
});
即使您有一个大表,它也应该快速填充,因为它是并行运行的。如果您愿意,没有“ConcurrentSet”,因此我们必须使用ConcurrentDictionary。字节只是一个占位符;所有值都将在partitionKeys.Keys中。