Pregunta

Tengo problemas para usar el tipo de tiempo_uuid como clave en mi columna. Quiero almacenar mis registros y hacer que se les ordene cuando se insertaron, y luego pensé que el Time_Uuid es un buen camino a seguir. Así es como he configurado mi familia de columnas:

sys.create_column_family("keyspace", "records", comparator_type=TIME_UUID_TYPE)

Cuando intento insertar, hago esto:

q=pycassa.ColumnFamily(pycassa.connect("keyspace"), "records")
myKey=pycassa.util.convert_time_to_uuid(datetime.datetime.utcnow())
q.insert(myKey,{'somedata':'comevalue'})

Sin embargo, cuando inserto datos, siempre recibo un error:

El argumento para un nombre o valor de la columna UUID V1 no era ni un UUID, una fecha y hora o un número.

Si cambio el comparador_type a UTF8_Type, funciona, pero el orden de los elementos cuando se devuelve no son como deberían ser. ¿Qué estoy haciendo mal?

¿Fue útil?

Solución

El comparador para una familia de columna se utiliza para ordenar las columnas dentro de cada fila. Estás viendo ese error porque 'Somedata' es UTF-8 válido pero no un UUID válido.

El partitorio determina el orden de las filas almacenadas en Cassandra. Lo más probable es que esté utilizando randompartitioner que distribuye la carga uniformemente en su clúster, pero no permite consultas de rango significativas (las filas se devolverán en un orden aleatorio).

http://wiki.apache.org/cassandra/faq#range_rp

Otros consejos

El problema es que en su modelo de datos, está utilizando la tecla de tiempo como fila. Aunque esto es posible, no recibirá un pedido significativo a menos que también use el byteorderedPartitioner.

Por esta razón, la mayoría de las personas insertan datos ordenados por el tiempo utilizando el tiempo como un nombre de columna, no una tecla de fila. En este modelo, su declaración de inserción se vería como:

q.insert(someKey, {datetime.datetime.utcnow(): 'somevalue'})

dónde someKey es una clave que se relaciona con toda la serie temporal que está insertando (por ejemplo, un nombre de usuario). (Tenga en cuenta que no tiene que convertir el tiempo en UUID, Pycassa lo hace por usted). Para almacenar algo más que un solo valor, use una supercolumna o una tecla compuesta.

Si realmente desea almacenar el tiempo en sus teclas de fila, entonces debe especificar key_validation_class, no comparator_type. comparator_type Establece el tipo de nombres de columna, mientras key_validation_class Establece el tipo de teclas de fila.

sys.create_column_family("keyspace", "records", key_validation_class=TIME_UUID_TYPE)

Recuerde que las filas no se clasificarán a menos que también use el byteorderedPartitioner.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top