目前,我正在使用PartitionKey將存儲數據的設備區分爲Azure Table Services。我想建立一個瀏覽器,允許我瀏覽這些數據,但是能夠構造它以便我可以「按設備」或通過PartitionKey查看數據,這將很不錯。查看器應用程序不會知道什麼設備存在,所以如果我可以以某種方式返回給定表中的不同PartionKeys列表,那將是非常好的。這是可能的,還是我將被降級到創建一個元數據表,我爲每個設備插入一個新行,然後用它來查詢?有沒有辦法從表中獲取不同的PartionKeys
回答
我不認爲有一種方法來檢索所有的分區鍵。這是一個聰明的解決辦法,但: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文檔。
遺憾的是,Azure表沒有獨立或其他功能 - 將其視爲結構化的基於鍵的存儲,如內存中的字典。您執行的任何操作都必須遍歷所有項目,以獲取它們的子集,除非知道要首先加載哪些鍵並處理該子列表。
我個人會簡單地使用第二個天藍色表格,並在那裏存儲分區鍵(作爲行鍵),然後您可以通過其他因素對這些鍵進行分組。或者簡單地爲第二個表使用單個分區鍵。
這會給你最好的表現和最少的頭痛。
有時,最簡單的方法是最好的方法,因爲你可以完成工作。
希望這有助於
創建一個表來存儲你的分區。按照您使用的表格名稱對錶格進行分區,併爲您創建的每個分區添加條目。
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, });
我敢打賭,這可以優化。
這將讓你在表中的所有分區鍵的列表:
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中。
我嘗試過類似的方法有:
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小時)或中等,但有許多屬性表
- 1. 有沒有辦法從c#中的變量中獲取命令?
- 2. 有沒有辦法從Repeater中的DataTable獲取Item的索引?
- 3. 有沒有辦法從方法中獲取此/上下文?
- 4. 有沒有辦法在PHP SDK中從Parse獲取所有類?
- 5. 有沒有辦法從azure中獲取所有文件
- 6. 有沒有辦法在Android中同步獲取服務?
- 7. 有沒有辦法從StoreKit API中的SKPayment獲取SKProduct?
- 8. 有沒有辦法從chrome的存儲映像中獲取url?
- 9. 有沒有辦法從Jersey中的javax.ws.rs.Client獲取請求信息?
- 10. 有沒有辦法從iOS中的CLLocation獲取街道名稱?
- 11. 有沒有辦法在SQLite中獲取表的約束?
- 12. 有沒有辦法獲取API來反應js中的表?
- 13. 有沒有辦法從EntityManager獲取所有的管理實體
- 14. 有沒有辦法來獲取手機
- 15. 有沒有辦法加快SQLite獲取?
- 16. 有沒有辦法從每組行中獲取2行?
- 17. 有沒有辦法從.java文件中獲取.class文件
- 18. 有沒有辦法從Open Graph中獲取數據?
- 19. 有沒有辦法從make調用中獲取-j參數?
- 20. 有沒有辦法從每個查詢中獲取2行?
- 21. 有沒有辦法從FileProtocolHandler或url.dll中獲取錯誤級別?
- 22. 氣體:有沒有辦法從庫中獲取onOpen()函數?
- 23. 有沒有辦法從XMLHttpRequest響應中獲取參數?
- 24. django manage.py - 有沒有辦法從環境中獲取--settings參數?
- 25. 有沒有辦法從文件中獲取cron作業
- 26. 有沒有辦法從對話框中獲取IShellBrowser?
- 27. 有沒有辦法從FutureTask獲得Callable?
- 28. 有沒有辦法從Gemfire獲得共同的集羣時間?
- 29. 有沒有辦法從Azure獲取所有DocumentDb資源?
- 30. 有沒有辦法從共享的Google表單文檔中獲取數據?
這種方法不會導致全表掃描嗎?更好的方法是爲每個分區(設備)創建一個單獨的表,或創建一個只包含每個設備信息的表(一種主細節方法)。 –
@GauravMantri - 是的,我認爲這可能會導致整個表掃描。我想這是一個問題,你是否希望在創建和管理額外的表方面花費更少的開銷,或者更高效地執行掃描 - 這將取決於您的使用情況以及數據量。不過你不需要單獨的表 - 只有其他分區的鍵的索引分區也可以。 – JcFx
無法返回所有分區(今天)。你將不得不掃描整個表來知道。使用元數據或通用算法來計算分區密鑰。 – dunnry