Actualmente estoy usando la PartitionKey para diferenciar los dispositivos que almacenan datos en Azure Table Services. Me gustaría construir un visor que me permita navegar por esos datos, pero sería bueno poder estructurarlo para poder ver los datos "por dispositivo" o por PartitionKey. La aplicación del visor no tendrá ningún conocimiento de qué dispositivos existen, por lo que sería genial si pudiera volver a obtener una lista de PartionKeys distintas en una tabla determinada. ¿Es esto posible, o voy a ser relegado a la creación de una tabla de metadatos en la que inserte una nueva fila para cada dispositivo, luego la uso para consultar?¿Hay alguna manera de obtener PartionKeys distintas de una Tabla
Respuesta
No creo que haya una forma de recuperar todas las claves de partición. He aquí una solución inteligente, sin embargo: http://blogs.msdn.com/b/avkashchauhan/archive/2011/10/23/retrieving-partition-key-range-in-windows-azure-table-storage.aspx
Para citar el blog de Avkash:
de excavación más, me pareció que no está construido en API para obtener una lista de claves de partición, en lugar tendría que crear una solución para mi Así que termino insertando una sola fila ficticia en cada partición y cuando quise obtener una lista de claves de partición, solo consulté esos ítems ficticios y me dieron la lista que estaba buscando.
estoy seguro de que ya habrá visto esto, pero para otros que pueden suceder en esta pregunta, creo que esta es la mejor guía para la funcionalidad de servicio de mesa: http://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-tables/ con ejemplos y enlaces a los documentos detallados del API.
Lamentablemente, las Tablas Azure no tienen funciones como distintas u otras, considérelo un almacenamiento estructurado basado en claves como un diccionario en la memoria. Cualquier operación que realice tendrá que recorrer todos los elementos para obtener un subconjunto a menos que sepa qué teclas desea cargar primero y procesar esa sublista.
Personalmente, simplemente usaría una segunda tabla azul y almacenaría las claves de partición allí (como teclas de fila), lo que le da la oportunidad de agruparlas por otro factor. O simplemente use una sola tecla de partición para esta segunda tabla.
Esto le daría el mejor rendimiento y la menor cantidad de dolor de cabeza.
A veces, el enfoque más simple es el mejor, ya que puede hacer el trabajo.
Espero que esto ayude,
crear una sola tabla para almacenar sus particiones. Particione la tabla por los nombres de tabla que utiliza y agregue una entrada para cada partición que cree.
public class PartitionEntry : TableServiceEntity { }
tableServiceContext.AddObject("TablePartitions", new PartitionEntry
{
PartitionKey = "<table name>",
RowKey = "<partition key>",
});
tableServiceContext.BeginSaveChanges(SaveChangesOptions.ContinueOnError, null, null);
luego solo consulte esta tabla para obtener una lista de las particiones. Esto es muy manejable para mí.
var tbl = tableServiceContext.CreateQuery<PartitionEntry>("TablePartitions");
return tbl.Where(i => i.PartitionKey == "<table name>")
.Select(i => new { PartitionKey = i.RowKey, });
Apuesto a que esto se puede optimizar.
Esto le dará una lista de todas las claves de partición en la tabla:
ConcurrentDictionary<string, byte> partitionKeys = new ConcurrentDictionary<string, byte>();
Parallel.ForEach(myTable.ExecuteQuery(new TableQuery()), entity =>
{
partitionKeys.TryAdd(entity.PartitionKey, 0);
});
Incluso si usted tiene una mesa grande, se debe llenar rápidamente becauwse se está ejecutando en paralelo. No existe un "ConcurrentSet", si lo desea, así que tenemos que usar ConcurrentDictionary. El byte es solo un marcador de posición; todos los valores estarán en partitionKeys.Keys.
he intentado enfoque similar antes con:
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();
...
superior, así como el suyo funcione muy lento en grande (una duración de 70 millones de filas de la tabla - alrededor de 2 horas) o medio, pero con mesa muchas propiedades
- 1. ¿Hay alguna manera de obtener las restricciones de una tabla en SQLite?
- 2. ¿Hay alguna manera de pausar una CABasicAnimation?
- 3. ¿Hay alguna manera de desactivar una etiqueta?
- 4. ¿Hay alguna manera de "limpiar" una superficie?
- 5. ¿Hay alguna manera de obtener datos ortográficos de un NSString?
- 6. ¿Hay alguna manera de usar una construcción para cada una para una tabla de guayaba?
- 7. Oracle: ¿Hay alguna manera de obtener los tipos de datos de columna para una vista?
- 8. ¿Hay alguna manera de obtener el objeto predeterminado de $ .ajax?
- 9. ¿Hay alguna manera fácil de obtener ServerName en Symfony?
- 10. ¿Hay alguna manera de obtener todas las variables en Ruby?
- 11. ¿Hay alguna manera fácil de obtener programáticamente el alfabeto?
- 12. ¿Hay alguna manera de obtener un REPL en pydev?
- 13. ¿Hay alguna manera de activar mousemove y obtener event.pageX, event.pageY?
- 14. ¿Hay alguna manera fácil de obtener sombras en OpenGL?
- 15. ¿Hay alguna manera de especificar el nombre de la tabla como una cadena?
- 16. ¿Hay alguna manera de hacer columnas de tabla igual a una fracción del ancho total?
- 17. ¿Hay alguna manera de revertir una cripta() en c?
- 18. ¿Hay alguna manera de usar ConcurrentDictionary.TryUpdate con una expresión lambda?
- 19. ¿Hay alguna manera de evitar recursiones innecesarias?
- 20. ¿Hay alguna manera fácil de adjuntar una fuente en Eclipse?
- 21. ¿Hay alguna manera de obtener el nombre de la función dentro de una función de C++?
- 22. ¿Hay alguna manera de especificar una expresión lambda C# "vacía"?
- 23. ¿Hay alguna manera de obtener una colección de formularios especiales de clojure programáticamente?
- 24. ¿Hay alguna manera fácil de obtener datos de usuario de AuthComponent desde una vista en CakePHP?
- 25. ¿Hay alguna manera de obtener una instancia de SlickGrid de un elemento
- 26. ¿Hay alguna manera de obtener el tamaño de una variable de PHP en bytes?
- 27. ¿Hay alguna manera de obtener atribución para una imagen de fondo en la capa de presentación?
- 28. ¿Hay alguna forma de obtener una dirección de referencia?
- 29. ¿hay alguna manera de averiguar de dónde viene una rama?
- 30. ¿Hay alguna manera de anular ConfigurationManager.AppSettings?
¿No resultaría este enfoque en un escaneo completo de la tabla? Un mejor enfoque sería crear una tabla separada para cada partición (dispositivo) o crear una tabla que solo tenga la información sobre cada dispositivo (tipo de enfoque de detalle maestro). –
@GauravMantri - Sí, creo que podría dar como resultado una exploración completa de la tabla. Supongo que se trata de si desea menos sobrecarga en la creación y administración de una tabla adicional, o una mayor eficiencia en la realización del escaneo, que dependerá de su caso de uso y del volumen de datos. Sin embargo, no necesita una tabla separada: una partición de índice con nada más que las claves de las otras particiones también lo haría. – JcFx
No hay forma de devolver todas las particiones (hoy). Tendría que escanear toda la mesa para saberlo. Use metadatos o algoritmos comunes que calculan qué tecla de partición sería. – dunnry