Skip to content

Instantly share code, notes, and snippets.

@Awes0meM4n
Created April 25, 2020 14:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Awes0meM4n/256c101c6f8ea08c947b6cf9aa68bde9 to your computer and use it in GitHub Desktop.
Save Awes0meM4n/256c101c6f8ea08c947b6cf9aa68bde9 to your computer and use it in GitHub Desktop.
cqlsh:prueba> CREATE KEYSPACE prueba
... WITH REPLICATION = {
... 'class': 'SimpleStrategy', 'replication_factor': 1
... };
cqlsh:prueba>
cqlsh:prueba> USE prueba;
cqlsh:prueba>
cqlsh:prueba> // La siguiente sentencia funciona en Cassandra
cqlsh:prueba>
cqlsh:prueba> CREATE TABLE producto (
... id int,
... nombre varchar,
... precio float,
... proveedor varchar,
... PRIMARY KEY (id));
cqlsh:prueba>
cqlsh:prueba> INSERT INTO producto (id, nombre, precio, proveedor)
... VALUES (1234, 'Silla Mod. 3', 75, 'Sillas Ruiz');
cqlsh:prueba>
cqlsh:prueba> SELECT * FROM producto WHERE id = 1234;
id | nombre | precio | proveedor
------+--------------+--------+-------------
1234 | Silla Mod. 3 | 75 | Sillas Ruiz
(1 rows)
cqlsh:prueba>
cqlsh:prueba> // Borramos el keyspace
cqlsh:prueba>
cqlsh:prueba> DROP KEYSPACE prueba;
cqlsh:prueba> CREATE KEYSPACE DIM
... WITH REPLICATION = {
... 'class': 'SimpleStrategy', 'replication_factor': 1 };
cqlsh:prueba>
cqlsh:prueba> USE DIM;
cqlsh:dim>
cqlsh:dim> CREATE TABLE usuarios (
... nombreusuario text PRIMARY KEY, email text, edad int );
cqlsh:dim>
cqlsh:dim> INSERT INTO usuarios (nombreusuario, email, edad)
... VALUES ('antonio', 'antonio@gmail.com', 25);
cqlsh:dim>
cqlsh:dim>
cqlsh:dim> // Partial Insert
cqlsh:dim>
cqlsh:dim> INSERT INTO usuarios (nombreusuario, edad)
... VALUES ('bea', 27 );
cqlsh:dim>
cqlsh:dim> SELECT * FROM usuarios;
nombreusuario | edad | email
---------------+------+-------------------
antonio | 25 | antonio@gmail.com
bea | 27 | null
(2 rows)
cqlsh:dim>
cqlsh:dim> //Uso de TTL
cqlsh:dim>
cqlsh:dim> INSERT INTO usuarios (nombreusuario, edad)
... VALUES ('federico', 60) USING TTL 10;
cqlsh:dim>
cqlsh:dim> // consultamos a federico
cqlsh:dim>
cqlsh:dim> SELECT * FROM usuarios;
nombreusuario | edad | email
---------------+------+-------------------
federico | 60 | null
antonio | 25 | antonio@gmail.com
bea | 27 | null
(3 rows)
cqlsh:dim>
cqlsh:dim> // y, pasados unos segundos, ya no está
cqlsh:dim> SELECT * FROM usuarios;
nombreusuario | edad | email
---------------+------+-------------------
antonio | 25 | antonio@gmail.com
bea | 27 | null
(2 rows)
cqlsh:dim>
cqlsh:dim> // Algunas consultas correctas
cqlsh:dim>
cqlsh:dim> SELECT * FROM usuarios;
nombreusuario | edad | email
---------------+------+-------------------
antonio | 25 | antonio@gmail.com
bea | 27 | null
(2 rows)
cqlsh:dim> SELECT * FROM usuarios LIMIT 2;
nombreusuario | edad | email
---------------+------+-------------------
antonio | 25 | antonio@gmail.com
bea | 27 | null
(2 rows)
cqlsh:dim> SELECT * FROM usuarios WHERE nombreusuario = 'antonio';
nombreusuario | edad | email
---------------+------+-------------------
antonio | 25 | antonio@gmail.com
(1 rows)
cqlsh:dim> SELECT nombreusuario, edad FROM usuarios WHERE nombreusuario = 'antonio';
nombreusuario | edad
---------------+------
antonio | 25
(1 rows)
cqlsh:dim> SELECT * FROM usuarios WHERE nombreusuario IN ('antonio', 'bea');
nombreusuario | edad | email
---------------+------+-------------------
antonio | 25 | antonio@gmail.com
bea | 27 | null
(2 rows)
cqlsh:dim>
cqlsh:dim> // Insertamos algunas filas
cqlsh:dim>
cqlsh:dim> INSERT INTO usuarios (nombreusuario, email, edad)
... VALUES ('carol', 'carol@gmail.com', 26 );
cqlsh:dim>
cqlsh:dim> INSERT INTO usuarios (nombreusuario, email, edad)
... VALUES ('david', 'david@gmail.com', 30 );
cqlsh:dim>
cqlsh:dim> SELECT * FROM usuarios;
nombreusuario | edad | email
---------------+------+-------------------
antonio | 25 | antonio@gmail.com
carol | 26 | carol@gmail.com
david | 30 | david@gmail.com
bea | 27 | null
(4 rows)
cqlsh:dim>
cqlsh:dim> // Cassandra no los ha insertado al final
cqlsh:dim>
cqlsh:dim> // Una consulta con un error que parece que podremos resolver
cqlsh:dim>
cqlsh:dim> SELECT * FROM USUARIOS WHERE email='antonio@email.com';
InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING"
cqlsh:dim>
cqlsh:dim> //Una consulta con un mensaje de error
cqlsh:dim>
cqlsh:dim> SELECT * FROM usuarios WHERE nombreusuario > 'david';
InvalidRequest: Error from server: code=2200 [Invalid query] message="Only EQ and IN relation are supported on the partition key (unless you use the token() function)"
cqlsh:dim>
cqlsh:dim> // Probamos lo que nos dice el error
cqlsh:dim>
cqlsh:dim> SELECT * FROM usuarios WHERE token(nombreusuario) > token('david');
nombreusuario | edad | email
---------------+------+-------
bea | 27 | null
(1 rows)
cqlsh:dim> CREATE TABLE t (a int,
... b int,
... c int,
... d int,
... PRIMARY KEY ((a, b), c, d) );
cqlsh:dim>
cqlsh:dim> INSERT INTO t (a,b,c,d) VALUES (0,0,0,0);
cqlsh:dim> INSERT INTO t (a,b,c,d) VALUES (0,0,1,1);
cqlsh:dim> INSERT INTO t (a,b,c,d) VALUES (0,1,2,2);
cqlsh:dim> INSERT INTO t (a,b,c,d) VALUES (0,1,3,3);
cqlsh:dim> INSERT INTO t (a,b,c,d) VALUES (1,1,4,4);
cqlsh:dim>
cqlsh:dim> SELECT * FROM t;
a | b | c | d
---+---+---+---
0 | 0 | 0 | 0
0 | 0 | 1 | 1
0 | 1 | 2 | 2
0 | 1 | 3 | 3
1 | 1 | 4 | 4
(5 rows)
cqlsh:dim>
cqlsh:dim> //Aunque parece que van ordenados, si inserto este, vemos que no
cqlsh:dim>
cqlsh:dim> INSERT INTO t (a,b,c,d) VALUES (21,1,4,4);
cqlsh:dim>
cqlsh:dim> SELECT * FROM t;
a | b | c | d
----+---+---+---
0 | 0 | 0 | 0
0 | 0 | 1 | 1
0 | 1 | 2 | 2
0 | 1 | 3 | 3
21 | 1 | 4 | 4
1 | 1 | 4 | 4
(6 rows)
cqlsh:dim> SELECT token(a,b) FROM t;
system.token(a, b)
----------------------
-5530785643908655543
-5530785643908655543
-5343711339996600080
-5343711339996600080
-4964483912252291273
5765203080415074583
(6 rows)
cqlsh:dim> SELECT COUNT (*) FROM usuarios;
count
-------
4
(1 rows)
Warnings :
Aggregation query used without partition key
cqlsh:dim>
cqlsh:dim> // GROUP BY funciona a partir de la ver. 3.10
cqlsh:dim>
cqlsh:dim> SELECT nombreusuario, email FROM usuarios;
nombreusuario | email
---------------+-------------------
antonio | antonio@gmail.com
carol | carol@gmail.com
david | david@gmail.com
bea | null
(4 rows)
cqlsh:dim> SELECT JSON nombreusuario, email FROM usuarios;
[json]
------------------------------------------------------------
{"nombreusuario": "antonio", "email": "antonio@gmail.com"}
{"nombreusuario": "carol", "email": "carol@gmail.com"}
{"nombreusuario": "david", "email": "david@gmail.com"}
{"nombreusuario": "bea", "email": null}
(4 rows)
cqlsh:dim> SELECT nombreusuario AS nombre, email FROM usuarios;
nombre | email
---------+-------------------
antonio | antonio@gmail.com
carol | carol@gmail.com
david | david@gmail.com
bea | null
(4 rows)
cqlsh:dim>
cqlsh:dim> CREATE TABLE datos_sensor (
... anyo int,
... sensor text,
... evento timeuuid,
... dato text,
... PRIMARY KEY ((anyo, sensor), evento) );
cqlsh:dim>
cqlsh:dim> //Si la clave de partición es compuesta, debemos especificar todas las columnas
cqlsh:dim> INSERT INTO datos_sensor (anyo, sensor, evento, dato)
... VALUES (2019, 'sensor 1', NOW(), 'dato 001');
cqlsh:dim>
cqlsh:dim> INSERT INTO datos_sensor (anyo, sensor, evento, dato)
... VALUES (2019, 'sensor 1', NOW(), 'dato 002');
cqlsh:dim>
cqlsh:dim> //Consulta incorrecta
cqlsh:dim>
cqlsh:dim> SELECT * FROM datos_sensor WHERE anyo = 2019;
InvalidRequest: Error from server: code=2200 [Invalid query] message="Partition key parts: sensor must be restricted as other parts are"
cqlsh:dim>
cqlsh:dim> //Consulta correcta
cqlsh:dim>
cqlsh:dim> SELECT * FROM datos_sensor WHERE anyo = 2019 AND sensor = 'sensor 1';
anyo | sensor | evento | dato
------+----------+--------------------------------------+----------
2019 | sensor 1 | c75de890-8536-11ea-8694-7d2af0c5777b | dato 001
2019 | sensor 1 | c75efa00-8536-11ea-8694-7d2af0c5777b | dato 002
(2 rows)
cqlsh:dim>
cqlsh:dim> CREATE TABLE mensajes (
... nombreusuario text,
... fecha date,
... hora time,
... cuerpo text,
... PRIMARY KEY (nombreusuario, fecha, hora));
cqlsh:dim>
cqlsh:dim> //Inserciones desordenadas dentro de la misma partition
cqlsh:dim>
cqlsh:dim> INSERT INTO mensajes (nombreusuario, fecha, hora, cuerpo)
... VALUES ('antonio', '2016-11-18', '08:30:55.123', 'Antonio Update 1');
cqlsh:dim>
cqlsh:dim> INSERT INTO mensajes (nombreusuario, fecha, hora, cuerpo)
... VALUES ('antonio', '2016-11-18', '14:40:25.123456789', 'Antonio Update 2');
cqlsh:dim>
cqlsh:dim> INSERT INTO mensajes (nombreusuario, fecha, hora, cuerpo)
... VALUES ('antonio', '2016-11-21', '08:35:55.123456', 'Antonio Update 4');
cqlsh:dim>
cqlsh:dim> INSERT INTO mensajes (nombreusuario, fecha, hora, cuerpo)
... VALUES ('antonio', '2016-11-21', '14:30:15.123', 'Antonio Update 5');
cqlsh:dim>
cqlsh:dim> INSERT INTO mensajes (nombreusuario, fecha, hora, cuerpo)
... VALUES ('antonio', '2016-11-23', '14:50:45.123456', 'Antonio Update 6');
cqlsh:dim>
cqlsh:dim> INSERT INTO mensajes (nombreusuario, fecha, hora, cuerpo)
... VALUES ('antonio', '2016-11-19', '08:25:25', 'Antonio Update 3');
cqlsh:dim>
cqlsh:dim> //En la consulta salen ordenadas por clave de clustering
cqlsh:dim>
cqlsh:dim> SELECT * FROM mensajes;
nombreusuario | fecha | hora | cuerpo
---------------+------------+--------------------+------------------
antonio | 2016-11-18 | 08:30:55.123000000 | Antonio Update 1
antonio | 2016-11-18 | 14:40:25.123456789 | Antonio Update 2
antonio | 2016-11-19 | 08:25:25.000000000 | Antonio Update 3
antonio | 2016-11-21 | 08:35:55.123456000 | Antonio Update 4
antonio | 2016-11-21 | 14:30:15.123000000 | Antonio Update 5
antonio | 2016-11-23 | 14:50:45.123456000 | Antonio Update 6
(6 rows)
cqlsh:dim>
cqlsh:dim> // Consulta correcta
cqlsh:dim>
cqlsh:dim> SELECT * FROM mensajes WHERE nombreusuario = 'antonio' AND fecha < '2016-11-20';
nombreusuario | fecha | hora | cuerpo
---------------+------------+--------------------+------------------
antonio | 2016-11-18 | 08:30:55.123000000 | Antonio Update 1
antonio | 2016-11-18 | 14:40:25.123456789 | Antonio Update 2
antonio | 2016-11-19 | 08:25:25.000000000 | Antonio Update 3
(3 rows)
cqlsh:dim>
cqlsh:dim> //Consulta incorrecta, ya que si se usa una comparación de > o < en una columna de
// clustering, todas las columnas precedentes de clustering deben tener una de =
cqlsh:dim>
cqlsh:dim> SELECT * FROM mensajes WHERE nombreusuario = 'antonio' AND fecha > '2016-11-20' AND hora > '12:00:00';
InvalidRequest: Error from server: code=2200 [Invalid query] message="Clustering column "hora" cannot be restricted (preceding column "fecha" is restricted by a non-EQ relation)"
cqlsh:dim>
cqlsh:dim> //Consulta correcta
cqlsh:dim>
cqlsh:dim> SELECT * FROM mensajes WHERE nombreusuario = 'antonio' AND fecha = '2016-11-21' AND hora > '12:00:00';
nombreusuario | fecha | hora | cuerpo
---------------+------------+--------------------+------------------
antonio | 2016-11-21 | 14:30:15.123000000 | Antonio Update 5
(1 rows)
cqlsh:dim>
cqlsh:dim> // Ejemplo de static usando la tabla de mensajes.
cqlsh:dim> // La modificamos con un ALTER TABLE
cqlsh:dim>
cqlsh:dim> ALTER TABLE MENSAJES ADD correo text STATIC;
cqlsh:dim>
cqlsh:dim> // Cambiamos el correo, y se cambia en todos
cqlsh:dim>
cqlsh:dim> UPDATE mensajes SET correo='antonio@mail.com' WHERE nombreusuario='antonio';
cqlsh:dim>
cqlsh:dim> SELECT * FROM MENSAJES;
nombreusuario | fecha | hora | correo | cuerpo
---------------+------------+--------------------+------------------+------------------
antonio | 2016-11-18 | 08:30:55.123000000 | antonio@mail.com | Antonio Update 1
antonio | 2016-11-18 | 14:40:25.123456789 | antonio@mail.com | Antonio Update 2
antonio | 2016-11-19 | 08:25:25.000000000 | antonio@mail.com | Antonio Update 3
antonio | 2016-11-21 | 08:35:55.123456000 | antonio@mail.com | Antonio Update 4
antonio | 2016-11-21 | 14:30:15.123000000 | antonio@mail.com | Antonio Update 5
antonio | 2016-11-23 | 14:50:45.123456000 | antonio@mail.com | Antonio Update 6
(6 rows)
cqlsh:dim>
cqlsh:dim> //Con un insert también lo cambia
cqlsh:dim> INSERT INTO mensajes (nombreusuario, fecha, hora, correo, cuerpo)
... VALUES ('antonio', '2020-04-24', '09:00:00', 'antonio@mail.com', 'Antonio Update 7');
cqlsh:dim>
cqlsh:dim> // Lo cambia en todos
cqlsh:dim>
cqlsh:dim> SELECT * FROM MENSAJES;
nombreusuario | fecha | hora | correo | cuerpo
---------------+------------+--------------------+------------------+------------------
antonio | 2016-11-18 | 08:30:55.123000000 | antonio@mail.com | Antonio Update 1
antonio | 2016-11-18 | 14:40:25.123456789 | antonio@mail.com | Antonio Update 2
antonio | 2016-11-19 | 08:25:25.000000000 | antonio@mail.com | Antonio Update 3
antonio | 2016-11-21 | 08:35:55.123456000 | antonio@mail.com | Antonio Update 4
antonio | 2016-11-21 | 14:30:15.123000000 | antonio@mail.com | Antonio Update 5
antonio | 2016-11-23 | 14:50:45.123456000 | antonio@mail.com | Antonio Update 6
antonio | 2020-04-24 | 09:00:00.000000000 | antonio@mail.com | Antonio Update 7
(7 rows)
cqlsh:dim>
cqlsh:dim> INSERT INTO mensajes (nombreusuario, fecha, hora, cuerpo)
... VALUES ('antonio', '2021-04-24', '09:00:00', 'Antonio Update 8');
cqlsh:dim> SELECT * FROM MENSAJES;
nombreusuario | fecha | hora | correo | cuerpo
---------------+------------+--------------------+------------------+------------------
antonio | 2016-11-18 | 08:30:55.123000000 | antonio@mail.com | Antonio Update 1
antonio | 2016-11-18 | 14:40:25.123456789 | antonio@mail.com | Antonio Update 2
antonio | 2016-11-19 | 08:25:25.000000000 | antonio@mail.com | Antonio Update 3
antonio | 2016-11-21 | 08:35:55.123456000 | antonio@mail.com | Antonio Update 4
antonio | 2016-11-21 | 14:30:15.123000000 | antonio@mail.com | Antonio Update 5
antonio | 2016-11-23 | 14:50:45.123456000 | antonio@mail.com | Antonio Update 6
antonio | 2020-04-24 | 09:00:00.000000000 | antonio@mail.com | Antonio Update 7
antonio | 2021-04-24 | 09:00:00.000000000 | antonio@mail.com | Antonio Update 8
(8 rows)
cqlsh:dim> // Updates e inserts son upserts
cqlsh:dim> // Un update normal
cqlsh:dim>
cqlsh:dim> UPDATE usuarios SET edad = 26, email='antonio@nuevo.com' WHERE nombreusuario = 'antonio';
cqlsh:dim> SELECT * FROM usuarios;
nombreusuario | edad | email
---------------+------+-------------------
federico | 60 | null
antonio | 26 | antonio@nuevo.com
carol | 26 | carol@gmail.com
david | 30 | david@gmail.com
bea | 27 | null
(5 rows)
cqlsh:dim>
cqlsh:dim> // En este caso, como no existen, los añade
cqlsh:dim> UPDATE usuarios SET edad=18 WHERE nombreusuario IN ('gemelo1','gemelo2','gemelo3');
cqlsh:dim> SELECT * FROM usuarios;
nombreusuario | edad | email
---------------+------+-------------------
federico | 60 | null
antonio | 26 | antonio@nuevo.com
carol | 26 | carol@gmail.com
gemelo3 | 18 | null
gemelo1 | 18 | null
gemelo2 | 18 | null
david | 30 | david@gmail.com
bea | 27 | null
(8 rows)
cqlsh:dim>
cqlsh:dim> //Podemo usar un TTL, pero al pasar el tiempo desaparece el valor, no vuelve atrás
cqlsh:dim> UPDATE usuarios USING TTL 5 SET edad = 90 WHERE nombreusuario = 'antonio';
cqlsh:dim> SELECT * FROM usuarios;
nombreusuario | edad | email
---------------+------+-------------------
federico | 60 | null
antonio | 90 | antonio@nuevo.com
carol | 26 | carol@gmail.com
gemelo3 | 18 | null
gemelo1 | 18 | null
gemelo2 | 18 | null
david | 30 | david@gmail.com
bea | 27 | null
(8 rows)
cqlsh:dim>
cqlsh:dim> //Los inserts también son updates
cqlsh:dim> INSERT INTO USUARIOS (nombreusuario, edad, email) VALUES ('carol', 28,'carol@gmail.com');
cqlsh:dim> SELECT * FROM usuarios;
nombreusuario | edad | email
---------------+------+-------------------
federico | 60 | null
antonio | 90 | antonio@nuevo.com
carol | 28 | carol@gmail.com
gemelo3 | 18 | null
gemelo1 | 18 | null
gemelo2 | 18 | null
david | 30 | david@gmail.com
bea | 27 | null
(8 rows)
cqlsh:dim> CREATE TABLE clientes (
... id UUID PRIMARY KEY,
... nombre text,
... ciudad text);
cqlsh:dim>
cqlsh:dim> INSERT INTO clientes (id, nombre, ciudad) VALUES (uuid(), 'Juan', 'Madrid');
cqlsh:dim> SELECT * FROM clientes WHERE ciudad = 'Madrid';
InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING"
cqlsh:dim> SELECT * FROM clientes WHERE ciudad = 'Madrid' ALLOW FILTERING;
id | ciudad | nombre
--------------------------------------+--------+--------
d4f62d95-006b-42c9-b026-0c3a2e5e4123 | Madrid | Juan
(1 rows)
cqlsh:dim>
cqlsh:dim> TRUNCATE clientes;
cqlsh:dim>
cqlsh:dim> DROP TABLE clientes;
cqlsh:dim>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment