2012-10-12 61 views
8

目前,我正在使用PartitionKey將存儲數據的設備區分爲Azure Table Services。我想建立一個瀏覽器,允許我瀏覽這些數據,但是能夠構造它以便我可以「按設備」或通過PartitionKey查看數據,這將很不錯。查看器應用程序不會知道什麼設備存在,所以如果我可以以某種方式返回給定表中的不同PartionKeys列表,那將是非常好的。這是可能的,還是我將被降級到創建一個元數據表,我爲每個設備插入一個新行,然後用它來查詢?有沒有辦法從表中獲取不同的PartionKeys

回答

6

我不認爲有一種方法來檢索所有的分區鍵。這是一個聰明的解決辦法,但: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文檔。

+7

這種方法不會導致全表掃描嗎?更好的方法是爲每個分區(設備)創建一個單獨的表,或創建一個只包含每個設備信息的表(一種主細節方法)。 –

+4

@GauravMantri - 是的,我認爲這可能會導致整個表掃描。我想這是一個問題,你是否希望在創建和管理額外的表方面花費更少的開銷,或者更高效地執行掃描 - 這將取決於您的使用情況以及數據量。不過你不需要單獨的表 - 只有其他分區的鍵的索引分區也可以。 – JcFx

+2

無法返回所有分區(今天)。你將不得不掃描整個表來知道。使用元數據或通用算法來計算分區密鑰。 – dunnry

2

遺憾的是,Azure表沒有獨立或其他功能 - 將其視爲結構化的基於鍵的存儲,如內存中的字典。您執行的任何操作都必須遍歷所有項目,以獲取它們的子集,除非知道要首先加載哪些鍵並處理該子列表。

我個人會簡單地使用第二個天藍色表格,並在那裏存儲分區鍵(作爲行鍵),然後您可以通過其他因素對這些鍵進行分組。或者簡單地爲第二個表使用單個分區鍵。

這會給你最好的表現和最少的頭痛。

有時,最簡單的方法是最好的方法,因爲你可以完成工作。

希望這有助於

11

創建一個表來存儲你的分區。按照您使用的表格名稱對錶格進行分區,併爲您創建的每個分區添加條目。

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

我敢打賭,這可以優化。

0

這將讓你在表中的所有分區鍵的列表:

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

即使你有一個大表,就應迅速填充becauwse它是在並行運行。如果你願意,沒有「ConcurrentSet」,所以我們必須使用ConcurrentDictionary。該字節只是一個佔位符;所有的值將在partitionKeys.Keys中。

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小時)或中等,但有許多屬性表

相關問題