Derzeit verwende ich den PartitionKey, um Geräte zu unterscheiden, die Daten in Azure Table Services speichern. Ich möchte einen Viewer erstellen, der es mir erlaubt, diese Daten zu durchsuchen, aber es wäre schön, sie so strukturieren zu können, dass ich Daten "nach Gerät" oder mit PartitionKey anzeigen kann. Die Viewer-App wird keine Kenntnis davon haben, welche Geräte existieren, also wäre es großartig, wenn ich irgendwie eine Liste von verschiedenen PartionKeys in einer gegebenen Tabelle zurückbekommen könnte. Ist das möglich, oder werde ich dazu verleitet, eine Metadatentabelle zu erstellen, in die ich für jedes Gerät eine neue Zeile einfüge, und diese dann für die Abfrage verwende?Gibt es eine Möglichkeit, bestimmte PartionKeys aus einer Tabelle zu erhalten
Antwort
Ich glaube nicht, dass es eine Möglichkeit gibt, alle Partitionsschlüssel abzurufen. Hier ist eine clevere Abhilfe, aber: http://blogs.msdn.com/b/avkashchauhan/archive/2011/10/23/retrieving-partition-key-range-in-windows-azure-table-storage.aspx
Zitat aus Avkash Blog:
weiter Graben, ich fand es nicht in API gebaut wird eine Liste der Partition Schlüssel zu bekommen, stattdessen hätte ich erstellen eine Lösung für mich. Also am Ende ich eine einzelne Dummy-Zeile in jede Partition einfügen und wenn Ich wollte eine Liste der Partition Schlüssel, die ich nur für diese Dummy Artikel abfragen und sie gaben mir die Liste, die ich suchte.
Ich bin sicher, dass Sie das schon gesehen haben, aber für andere, die auf diese Frage kann passieren, ich denke, das ist die beste Anleitung zur Bedienung am Tisch Funktionalität: http://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-tables/ mit Beispielen und Links zu den ausführlichen API-Dokumentation.
Bedauerlicherweise haben Azure Tables keine Funktionen wie distinct oder andere - betrachten Sie es als strukturierten Schlüsselspeicher wie ein Dictionary im Speicher. Jede Operation, die Sie ausführen, muss alle Elemente durchlaufen, um eine Teilmenge davon zu erhalten, es sei denn, Sie wissen, welche Schlüssel zuerst geladen werden sollen, und verarbeiten diese Unterliste.
Ich würde persönlich einfach eine zweite azurblaue Tabelle verwenden und die Partitionsschlüssel dort (als Zeilenschlüssel) speichern, die Ihnen dann eine Gelegenheit gibt, diese durch einen anderen Faktor zu gruppieren. Oder verwenden Sie einfach einen einzelnen Partitionsschlüssel für diese zweite Tabelle.
Dies würde Ihnen die beste Leistung und die geringste Menge an Kopfschmerzen geben.
Manchmal ist der einfachste Ansatz der beste, da Sie den Job erledigen können.
hoffe, das hilft,
Erstellen Sie eine einzelne Tabelle, um Ihre Partitionen zu speichern. Partitionieren Sie die Tabelle nach den von Ihnen verwendeten Tabellennamen, und fügen Sie für jede von Ihnen erstellte Partition einen Eintrag hinzu.
public class PartitionEntry : TableServiceEntity { }
tableServiceContext.AddObject("TablePartitions", new PartitionEntry
{
PartitionKey = "<table name>",
RowKey = "<partition key>",
});
tableServiceContext.BeginSaveChanges(SaveChangesOptions.ContinueOnError, null, null);
dann nur diese Tabelle abfragen, um eine Liste der Partitionen zu erhalten. Das ist sehr überschaubar für mich.
var tbl = tableServiceContext.CreateQuery<PartitionEntry>("TablePartitions");
return tbl.Where(i => i.PartitionKey == "<table name>")
.Select(i => new { PartitionKey = i.RowKey, });
Ich wette, das könnte optimiert werden.
ConcurrentDictionary<string, byte> partitionKeys = new ConcurrentDictionary<string, byte>();
Parallel.ForEach(myTable.ExecuteQuery(new TableQuery()), entity =>
{
partitionKeys.TryAdd(entity.PartitionKey, 0);
});
Auch wenn Sie einen großen Tisch haben, sollte es schnell füllen becauwse es parallel ausgeführt wird:
Dies wird Ihnen eine Liste aller Partitionsschlüssel in der Tabelle erhalten. Es gibt kein "ConcurrentSet", wenn Sie wollen, also müssen wir ConcurrentDictionary verwenden. Das Byte ist nur ein Platzhalter; Alle Werte werden in partitionKeys.Keys angegeben.
i ähnlichen Ansatz versucht, bevor mit:
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();
...
oberen als auch bei Ihnen auf großen sehr langsam arbeiten (für 70 Millionen Zeilen Tabelle laufen - ca. 2 Stunden) oder Medium, aber mit vielen Eigenschaften Tabelle
- 1. Gibt es eine Möglichkeit, bestimmte UIImageView-Eigenschaften zu erhalten?
- 2. Gibt es eine Möglichkeit, den Ursprung einer Alarmbox zu erhalten?
- 3. Gibt es eine bessere Möglichkeit, alte Daten zu erhalten?
- 4. Gibt es eine Möglichkeit, einer Tabelle eine Mindesthöhe hinzuzufügen?
- 5. Einfachste Möglichkeit, Daten aus einer dynamischen HTML-Tabelle zu erhalten
- 6. Gibt es eine datenbankunabhängige Möglichkeit, Datenänderungsbenachrichtigungen auf Feldebene zu erhalten?
- 7. Gibt es eine Möglichkeit, Werte aus einer Map in einer MATLAB-Mex-Datei zu erhalten?
- 8. Gibt es eine Möglichkeit, eine Löschbestätigung aus einer Array-Liste zu erhalten?
- 9. Gibt es eine Möglichkeit, bestimmte Elemente aus einer Liste <T> mit LINQ zu entfernen?
- 10. Gibt es eine Möglichkeit, Quartalstermine in MS SQL zu erhalten?
- 11. Gibt es eine Möglichkeit, eine Tabelle in einer DBML-Datei in Visual Studio 2008 zu finden?
- 12. Gibt es eine Möglichkeit, eine Cookie-Antwort schnell zu erhalten?
- 13. gibt es eine Möglichkeit, 'sysmessages' Tabelle aus einer Datenbank zu löschen?
- 14. Gibt es eine Möglichkeit, Pixeldaten vom Internet Explorer zu erhalten?
- 15. Gibt es eine Möglichkeit, die ursprüngliche IP-Adresse aus einer JMS-Nachricht zu erhalten?
- 16. Gibt es eine Möglichkeit, mehrere Listen aus einer nativen SQL-Abfrage im Ruhezustand zu erhalten?
- 17. Gibt es eine Möglichkeit, die Anzahl der Datensätze aus einer Abfrage mit Zend-Framework zu erhalten?
- 18. Gibt es eine Möglichkeit, alle Stile aus einer Doc-Datei mit Apache Tika zu erhalten?
- 19. Gibt es eine ergänzende Möglichkeit, etwas wie Mausereignisse zu erhalten?
- 20. Gibt es eine Möglichkeit, field => value-Paare aus einem Subselect in MySQL zu erhalten?
- 21. Gibt es eine Möglichkeit, Twitter-Benutzer-E-Mails zu erhalten?
- 22. Gibt es eine Möglichkeit, jQuery AJAX Upload-Fortschritt zu erhalten?
- 23. Gibt es eine Möglichkeit, HSQLDB-Daten zu erhalten?
- 24. Gibt es eine Möglichkeit, die Textfeldinformationen eines Containers zu erhalten?
- 25. Gibt es eine Möglichkeit, die Sicherheit Panel-Daten zu erhalten
- 26. Gibt es eine Möglichkeit, alle Attribute eines DOMEelements zu erhalten?
- 27. Gibt es eine Möglichkeit, Publishing Queue in Sitecore zu erhalten?
- 28. Gibt es eine Möglichkeit, Tastaturereignisse ohne JFrame zu erhalten?
- 29. Gibt es eine Möglichkeit, den Fortschrittswert eines Fensters zu erhalten?
- 30. glibc: Gibt es eine Möglichkeit, die verwendeten Konfigurationsbefehlszeilenoptionen zu erhalten?
Würde diese Vorgehensweise nicht zu einem vollständigen Tabellenscan führen? Ein besserer Ansatz wäre, entweder eine separate Tabelle für jede Partition (Gerät) zu erstellen oder eine Tabelle zu erstellen, die nur die Informationen über jedes Gerät enthält (Art des Hauptdetailansatzes). –
@GauravMantri - Ja, ich denke, es könnte zu einem ganzen Tabellen-Scan führen. Ich denke, es ist eine Frage, ob Sie weniger Aufwand beim Erstellen und Verwalten einer zusätzlichen Tabelle oder mehr Effizienz bei der Durchführung des Scans haben wollen - was von Ihrem Anwendungsfall und dem Datenvolumen abhängen wird. Sie brauchen jedoch keine separate Tabelle - eine Indexpartition mit nichts als Schlüsseln zu den anderen Partitionen würde ebenfalls funktionieren. – JcFx
Es gibt keine Möglichkeit, alle Partitionen (heute) zurückzugeben. Sie müssten die gesamte Tabelle scannen, um zu wissen. Verwenden Sie Metadaten oder einen gemeinsamen Algorithmus, der den Partitionsschlüssel berechnet. – dunnry