2012-10-12 14 views
8

bir tablo farklı PartionKeys almanın bir yolu var mı. Bu verilere göz atmamı sağlayan bir görüntüleyici oluşturmak isterdim, ancak verileri "cihaza göre" veya PartitionKey tarafından görüntüleyebilmek için yapılandırabilmek güzel olurdu. Görüntüleyici uygulaması, hangi cihazların var olduğuna dair herhangi bir bilgiye sahip olmayacaktır. Bu nedenle, belirli bir Tablodaki belirli PartionKey'lerin bir listesini geri alabilsem harika olurdu. Bu mümkün mü, yoksa her aygıt için yeni bir satır eklediğim meta-veri tablosu oluşturmaya gidiyorum, sonra bunu sorgulama için kullanacağım mı?Şu anda Azure Tablo Hizmetleri içine veri depolamak aygıtları ayırt etmek PartitionKey kullanıyorum

cevap

6

Bütün bölüm anahtarlarını almak için bir yolu yoktur sanmıyorum. Burada olsa, akıllı çözüm var: http://blogs.msdn.com/b/avkashchauhan/archive/2011/10/23/retrieving-partition-key-range-in-windows-azure-table-storage.aspx

Avkash blog gelen alıntı:

ayrıca kazma, bölüm tuşlarının bir listesini almak için API yerleşik hiçbir edilir orada bulunan, bunun yerine oluşturmak zorunda kalacak kendim için bir çözüm. Yani her bölüm içine tek kukla satır ekleme sona ve ben sadece bu kukla öğeler için sorgulamak bölüm tuşlarının bir listesini almak istediğini ve bana aradığım listesini verdi.

Ben zaten bunu görmüş, ancak bu soru üzerine meydana gelebilecek başka olacak eminim, ben bu tabloda hizmet fonksiyonlar için en rehber olduğunu düşünüyorum: detaylı API dokümanlara örnekler ve bağlantılar ile http://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-tables/.

+7

Bu yaklaşım tam tablo taramasına neden olmaz mı? Daha iyi bir yaklaşım, her bir Bölüm (cihaz) için ayrı bir tablo oluşturmak ya da sadece her cihazla ilgili bilgileri içeren bir tablo oluşturmak (ana detay yaklaşımı gibi) olacaktır. –

+4

@GauravMantri - Evet, bence bir tablo taramasıyla sonuçlanabilir. Sanırım, ek bir tablo oluştururken ve yönetirken veya tarama işlemini yaparken daha fazla verim elde etmenin - kullanım durumunuza ve veri hacmine bağlı olarak - daha az masraf isteyip istemediğinizi düşünelim. Ancak ayrı bir tabloya ihtiyacınız yok - diğer bölümlere ait anahtarlardan başka hiçbir şey olmayan bir dizin bölümü de. – JcFx

+2

Tüm bölümleri (bugün) döndürmenin bir yolu yoktur. Bilmek için tüm tabloyu taramanız gerekir. Hangi bölüm anahtarının olacağını hesaplayan meta veri veya ortak algoritma kullanın. – dunnry

2

Üzülerek Azure Tablolar ayrı veya diğerleri gibi işlevleri yoktur - bu bellekte bir Dictionary gibi yapılandırılmış bir anahtar tabanlı depolama düşünün. Gerçekleştirdiğiniz herhangi bir işlem, hangi alt anahtarları yüklemek istediğinizi bilmedikçe ve alt listeyi işlemek için, bunların alt kümesini almak için tüm öğeler arasında yineleme yapmak zorunda kalacaktır.

Şahsen, sadece basit bir masmavi masayı kullanabilir ve orada bölüm tuşlarını (satır tuşları olarak) saklayabilirim ki bu da bunları başka bir faktörle gruplamak için bir fırsat verir. Ya da sadece bu ikinci tablo için tek bir bölüm anahtarı kullanın.

Bu size en iyi performansı ve baş ağrısı en az miktarda verecekti.

Bazen en basit yaklaşım sadece işi gibi iyi biridir. Bu yardımcı olur

Umut,

11

sizin bölümleri depolamak için tek bir tablo oluşturun. Tabloyu, kullandığınız tablo adlarına göre bölümlere ayırın ve oluşturduğunuz her bölüm için bir giriş ekleyin.

public class PartitionEntry : TableServiceEntity { } 

tableServiceContext.AddObject("TablePartitions", new PartitionEntry 
{ 
    PartitionKey = "<table name>", 
    RowKey = "<partition key>", 
}); 
tableServiceContext.BeginSaveChanges(SaveChangesOptions.ContinueOnError, null, null); 

sonra sadece bölümleri listesini almak için bu tabloyu sorgulamak. Bu benim için çok yönetilebilir.
var tbl = tableServiceContext.CreateQuery<PartitionEntry>("TablePartitions"); 
return tbl.Where(i => i.PartitionKey == "<table name>") 
      .Select(i => new { PartitionKey = i.RowKey, }); 

bu optimize edilebilecek bahis. o paralel olarak çalıştığı becauwse

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

Büyük bir tablo olsa bile, hızla doldurmak gerekir:

0

Bu size tablodaki tüm bölüm tuşlarının bir listesini alacak. Eğer yapacaksanız, "ConcurrentSet" yoktur, bu yüzden ConcurrentDictionary kullanmak zorundayız. Bayt sadece bir yer tutucudur; tüm değerler partitionKeys.Keys.I ile daha önce benzer bir yaklaşım güvenilir

0

(70 milyon satır tablo aday - yaklaşık 2 saat) üst yanı sizin büyük çok yavaş çalışır şekilde

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

ya da ortam ancak birçok özellikleri, tablo ile