ventajas tutorial historia español desventajas curso consultas comandos capacidades cassandra cql

tutorial - Error al crear la tabla en cassandra-Solicitud incorrecta: solo las columnas de la clave del clúster se pueden definir en directivo CLUSTERING ORDER



curso de cassandra (2)

Obtengo el error anterior cuando trato de usar la siguiente instrucción cql, no estoy seguro de qué está mal con ella.

CREATE TABLE Stocks( id uuid,   market text,   symbol text, value text, time timestamp,   PRIMARY KEY(id) ) WITH CLUSTERING ORDER BY (time DESC); Bad Request: Only clustering key columns can be defined in CLUSTERING ORDER directive

Pero esto funciona bien, ¿no puedo usar alguna columna que no forme parte de la clave primaria para organizar mis filas?

CREATE TABLE timeseries ( ... event_type text, ... insertion_time timestamp, ... event blob, ... PRIMARY KEY (event_type, insertion_time) ... ) ... WITH CLUSTERING ORDER BY (insertion_time DESC);


"¿No puedo usar alguna columna que no forme parte de la clave principal para organizar mis filas?"

No, no puedes. De la documentación de DataStax en el comando SELECCIONAR:

Las cláusulas ORDER BY pueden seleccionar solo una columna. Esa columna tiene que ser la segunda columna en un compuesto PRIMARY KEY. Esto también se aplica a las tablas con más de dos componentes de columna en la clave principal.

Por lo tanto, para que su primer CREATE funcione, tendrá que ajustar su PRIMARY KEY a esto:

PRIMARY KEY(id,time)

La segunda columna de una clave primaria compuesta se conoce como la "columna de agrupamiento". Esta es la columna que determina el orden de clasificación en disco de los datos dentro de una clave de particionamiento . Tenga en cuenta que la última parte en cursiva, porque es importante. Cuando consulta su familia de columnas Stocks (tabla) por id , se devolverán todas las "filas" de valores de columna para esa id , ordenadas por time . En Cassandra solo puede especificar el orden dentro de una clave de particionamiento (y no para toda su tabla), y su clave de partición es la primera clave que figura en una clave primaria compuesta.

Por supuesto, el problema con esto es que probablemente desee que el id sea ​​único (lo que significa que CQL solo devolverá una "fila" de valores de columna por clave de partición). Requerir time para ser parte de la clave primaria niega eso, y hace posible almacenar múltiples valores para la misma identificación. Este es el problema con la partición de sus datos mediante una identificación única. Puede ser una buena idea en el mundo RDBMS, pero puede hacer que las consultas en Cassandra sean más difíciles.

Esencialmente, vas a necesitar volver a visitar tu modelo de datos aquí. Por ejemplo, si desea consultar los precios a lo largo del tiempo, puede asignar un nombre a la tabla como "StockPriceEvents" con una clave principal de (id,time) o (symbol,time) . Consultar esa tabla le daría los precios registrados para cada identificación o símbolo, ordenados por tiempo. Ahora que puede o no tener algún valor para su caso de uso. Solo trato de explicar cómo funcionan las claves primarias y el orden en Cassandra.

Nota: Realmente debería usar nombres de columna que tengan más significado. Cosas como "id", "time" y "timeseries" son bastante vagas, realmente no describen nada sobre el contexto en el que se usan.


Al crear una tabla en Cassandra con la opción " CLUSTERING ORDER BY ", asegúrese de que la columna de clústeres sea Primary.

Debajo de la tabla creada con la columna de clúster, pero la columna de clúster "Fecha y hora" no es una columna de clave principal. Por lo tanto, debajo del error.

ERROR_SCRIPT

cqlsh> CREATE TABLE IF NOT EXISTS cpdl3_spark_cassandra.log_data ( ... IP text, ... URL text, ... Status text, ... UserAgent text, ... Datetime timestamp, ... PRIMARY KEY (IP) ... ) WITH CLUSTERING ORDER BY (Datetime DESC);

ERROR: InvalidRequest: error del servidor: código = 2200 [Consulta inválida] message = "Solo las columnas de clave de agrupamiento se pueden definir en la directiva CLUSTERING ORDER"

CORRECTED_SCRIPT (donde se agrega "Fecha y hora" en las columnas de la clave principal)

cqlsh> CREATE TABLE IF NOT EXISTS cpdl3_spark_cassandra.log_data ( ... IP text, ... URL text, ... Status text, ... UserAgent text, ... Datetime timestamp, ... PRIMARY KEY (IP,Datetime) ... ) WITH CLUSTERING ORDER BY (Datetime DESC);