cassandra - presente - wh questions ejemplos y respuestas
Cassandra: pregunta con where cláusula que contiene greather- o lesser-than(<y>) (1)
Los índices de Cassandra en realidad no admiten el acceso secuencial; ver http://www.datastax.com/docs/1.1/ddl/indexes para una buena explicación rápida de dónde son útiles. Pero no te desesperes; la forma más clásica de usar Cassandra (y muchos otros sistemas NoSQL) es desnormalizar, desnormalizar, desnormalizar.
En su caso, puede ser una buena idea usar el patrón clásico de intervalo de cubetas, que le permite utilizar el RandomPartitioner recomendado y mantener sus filas bien distribuidas alrededor de su clúster, a la vez que permite el acceso secuencial a sus valores. La idea en este caso es que usted haga un segundo valor col3 de mapeo de columna dinámico en la familia (encuadrado y ordenado) a los valores primary_key
relacionados. Como ejemplo, si los valores de col3
van de 0 a 10 ^ 9 y están distribuidos de manera bastante uniforme, puede colocarlos en 1000 cubos de 10 ^ 6 cada uno (el mejor nivel de granularidad dependerá del tipo de consultas que necesidad, el tipo de datos que tiene, consultar el tiempo de ida y vuelta, etc.). Esquema de ejemplo para cql3:
CREATE TABLE indexotron (
rangestart int,
col3val int,
table1key varchar,
PRIMARY KEY (rangestart, col3val)
) WITH COMPACT STORAGE;
Al insertar en la table1
, debe insertar una fila correspondiente en indexotron
, con rangestart = int(col3val / 1000000)
. Luego, cuando necesite enumerar todas las filas en la table1
con col3> X, debe consultar hasta 1000 cubos de indexotron
, pero se col3val
todos los col3val
s dentro. table1.primary_key
ejemplo para encontrar todos los valores table1.primary_key
para los cuales table1.col3 < 4021
:
SELECT * FROM indexotron WHERE rangestart = 0 ORDER BY col3val;
SELECT * FROM indexotron WHERE rangestart = 1000 ORDER BY col3val;
SELECT * FROM indexotron WHERE rangestart = 2000 ORDER BY col3val;
SELECT * FROM indexotron WHERE rangestart = 3000 ORDER BY col3val;
SELECT * FROM indexotron WHERE rangestart = 4000 AND col3val < 4021 ORDER BY col3val;
Estoy usando Cassandra 1.1.2. Estoy tratando de convertir una aplicación RDBMS a Cassandra. En mi aplicación RDBMS tengo la siguiente tabla llamada tabla1:
| Col1 | Col2 | Col3 | Col4 |
- Col1: String (clave principal)
- Col2: String (clave principal)
- Col3: Bigint (índice)
- Col4: Bigint
Esta tabla cuenta más de 200 millones de registros. La consulta utilizada en su mayoría es algo así como:
Select * from table where col3 < 100 and col3 > 50;
En Cassandra usé la siguiente declaración para crear la tabla:
create table table1 (primary_key varchar, col1 varchar,
col2 varchar, col3 bigint, col4 bigint, primary key (primary_key));
create index on table1(col3);
Cambié la clave principal a una columna adicional (calculo la clave dentro de mi aplicación). Después de importar unos pocos registros, traté de ejecutarlo después de cql:
select * from table1 where col3 < 100 and col3 > 50;
Este resultado es:
Bad Request: No indexed columns present in by-columns clause with Equal operator
La consulta selecciona col1, col2, col3, col4 de la tabla 1 donde col3 = 67 funciona
Google dijo que no hay manera de ejecutar ese tipo de consultas. ¿Está bien? ¿Algún consejo sobre cómo crear una consulta?