有没有办法从表中获取不同的PartionKeys

时间:2012-10-12 15:37:20

标签: .net azure azure-table-storage

目前我正在使用PartitionKey来区分将数据存储到Azure Table Services的设备。我想构建一个允许我浏览该数据的查看器,但能够构建它以便我可以“通过设备”或通过PartitionKey查看数据会很好。查看器应用程序将不知道存在哪些设备,因此如果我能以某种方式返回给定表中的不同PartionKeys列表将会很棒。这是可能的,还是我将被降级为创建一个元数据表,我为每个设备插入一个新行,然后用它来查询?

5 个答案:

答案 0 :(得分:13)

创建一个表来存储您的分区。按您使用的表名对表进行分区,并为您创建的每个分区添加一个条目。

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, });

我打赌这可以优化。

答案 1 :(得分:7)

我认为没有办法检索所有分区键。不过,这是一个聪明的解决方法:http://blogs.msdn.com/b/avkashchauhan/archive/2011/10/23/retrieving-partition-key-range-in-windows-azure-table-storage.aspx

引用Avkash的博客:

  

进一步深入研究,我发现没有内置的API来获取列表   分区键,而我必须为自己创建一个解决方案。   所以我最终在每个分区中插入一个虚拟行以及何时   我想得到一个分区键列表,我只是查询那些虚拟   物品,他们给了我正在寻找的清单。

我确信您已经看过这个,但对于其他可能会遇到此问题的人,我认为这是表格服务功能的最佳指南:http://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-tables/包含示例和指向详细API文档的链接

答案 2 :(得分:3)

遗憾的是,Azure Tables没有像distinct或其他类似的功能 - 认为它是一个结构化的基于密钥的存储,就像内存中的Dictionary一样。您执行的任何操作都必须遍历所有项目才能获取它们的子集,除非知道您要先加载哪些键并处理该子列表。

我个人会简单地使用第二个azure表并将分区键存储在那里(作为行键),这样你就有机会按照另一个因素对它们进行分组。或者只是为第二个表使用单个分区键。

这会给你最好的表现和最少的头痛。

有时,最简单的方法是最好的方法,因为你可以完成工作。

希望这有帮助,

答案 3 :(得分:0)

这将为您提供表格中所有分区键的列表:

ConcurrentDictionary<string, byte> partitionKeys = new ConcurrentDictionary<string, byte>();
Parallel.ForEach(myTable.ExecuteQuery(new TableQuery()), entity =>
{
    partitionKeys.TryAdd(entity.PartitionKey, 0);
});

即使你有一个大表,它也应该快速填充,因为它并行运行。没有&#34; ConcurrentSet,&#34;如果你愿意,那么我们必须使用ConcurrentDictionary。该字节只是一个占位符;所有值都将在partitionKeys.Keys中。

答案 4 :(得分:0)

我之前尝试过类似的方法:

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();
...

上部和你的工作速度非常慢(运行70万行表 - 约2小时)或中等但有许多属性表