29. 11.2013 Cassandra Query Language (CQL) Seminar: NoSQL Wintersemester 2013/2014 Cassandra Zwischenpräsentation 1 NoSQL-Seminar Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz 29. 11.2013 Gliederung Basic facts Datentypen DDL/DML ähnlich zu SQL Besonderheiten NoSQL-Seminar Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz 29. 11.2013 Basic facts CQL kurz für Cassandra Query Language Ähnliche Aussprache zu SQL (Missverständnisse möglich) Aktuell CQL 3 Ersetzt Apache Thrift API ‚Almost SQL‘ : SQL-konform, wo es möglich ist ‚Denormalized SQL‘: Denormalisierung hat Auswirkung auf die Art der Anfragen NoSQL-Seminar Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 1 / 16 29. 11.2013 Datentypen ascii, bigint, blob, boolean, counter, double, … map,set,list uuid ‚Universally Unique Identifier‘ (Identifier Standard) [Version – Time – Raw bytes] ‚practically unique‘ Werte in verteilten Systemen Beispielwert: 550e8400-e29b-41d4-a716-446655440000 timeuuid (Type-1 uuid) Uuid Type-1 [Time – Raw bytes], nützlich für zeitliche Sortierungen Falls mehrere Timestamps gleich sein können, nützliche Funktionen: dateOf() NoSQL-Seminar Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 2 / 16 29. 11.2013 Collection types (Datentypen) Set: Sammlung von unique values in ihrer natürlichen Sortierreihenfolge CREATE TABLE users ( … emails set<text> ); INSERT INTO users (…, emails) VALUES (…, {‘[email protected]‘, ‘[email protected]‘}); UPDATE users SET emails = emails + (‘[email protected]‘) WHERE … NoSQL-Seminar Verfasser/in UPDATE users SET emails = emails - (‘[email protected]‘) WHERE … Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 3 / 16 29. 11.2013 Collection types (Datentypen) List: Mehrfachwerte, Sortierreihenfolge nach Listenindex CREATE TABLE users ( … places list<text> ); UPDATE users SET places = places + [‘city3‘] WHERE … INSERT INTO users (…, places) VALUES (…, [‘city1‘, ‘city2‘]); UPDATE users SET places = [‘city3‘] + places WHERE … UPDATE users SET places[2] = [‘city3‘] WHERE … NoSQL-Seminar Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 4 / 16 29. 11.2013 Collection types (Datentypen) Map: Key-Value Pairs, intern als Columns gespeichert CREATE TABLE users ( … todo map<timestamp, text> ); INSERT INTO users (…, todo) VALUES (…, {‘2010-08-09 10:00‘ : ‘activity1‘, ‘2011-09-01 11:00‘ : ‘activity2‘ }); UPDATE users SET todo[‘2012-01-01 01:00‘] = ‚activity3‘ WHERE … NoSQL-Seminar Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 5 / 16 29. 11.2013 Keyspace (DDL) CQL Pendant zu ‚database‘ Auf Clustern werden Mengen von Keyspaces verwaltet Ein Cluster hat einen Keyspace / Anwendung Keyspaces werden mit einer Replikationsstrategie angelegt ‚SimpleStrategy‘ = ausreichend für 1 Cluster ‚NetworkTopologyStrategy‘ = für mehr als 1 Cluster (production use) CREATE KEYSPACE demodb WITH REPLICATION = { ‘class’ : ‘SimpleStrategy’, ‘replication_factor’: 3 }); NoSQL-Seminar DROP KEYSPACE demodb; Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 6 / 16 29. 11.2013 Tables (DDL) Wie in SQL: CREATE TABLE employee ( empId int, deptId int, firstName varchar, lastName varchar, PRIMARY KEY(empId, deptId) ); NoSQL-Seminar DROP TABLE employee; Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 7 / 16 29. 11.2013 Alter Table (DDL) Column hinzufügen: ALTER TABLE employee ADD attr17 varchar; Datentyp einer column ändern: ALTER TABLE employee ALTER attr17 TYPE int; Column löschen (auf Rowbasis): DELETE attr17 FROM employee WHERE empId = 104; NoSQL-Seminar Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 8 / 16 29. 11.2013 SELECT Wie in SQL: SELECT * FROM employee WHERE empId IN (130, 104) ORDER BY deptId DESC; NoSQL-Seminar Vorsicht bei * -> Wide Columns Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 9 / 16 29. 11.2013 Insert into (DML) Wie in SQL: INSERT INTO employee (empId, deptId, firstName, lastName) VALUES (104, 15, ‘Peter’, ‘Parker’); DELETE FROM employee WHERE empId = 104; NoSQL-Seminar Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 10 / 16 29. 11.2013 ‚Upsert‘ INSERT INTO / UPDATE sind semantisch identisch, zunächst nur Update Beide Operationen erzeugen, wenn nicht vorhanden und ändern, wenn vorhanden Keine Fehlermeldung (Erzeugen – existiert schon) bzw. (Ändern – existiert nicht) Wahrscheinlich gefährlichstes Missverständnis SQL / CQL Vor einem write wird kein read gemacht (Verteilung) Empfehlung: Nutzung wie in SQL um die Intention auszudrücken INSERT INTO employee…….. …… IF NOT EXISTS NoSQL-Seminar Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 11 / 16 29. 11.2013 Denormalisierung Relationale Datenmodellierung: Nicht redundante, konsistente Daten Beliebig komplizierte, flexible queries um bestimmte Sichten zu erzeugen Indizes entsprechend anpassbar Datenmodellierung in Cassandra: Datenmodellierung den Sichten angepasst Hauptziel: Schnelle queries, d.h. 1 query to 1 node Keine joins, aggregations, eingeschränktes ORDER BY, usw.. Datenmodellierung muss all dies berücksichtigen! NoSQL-Seminar Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 12 / 16 29. 11.2013 Columns Columns werden intern mit Timestamp gespeichert Sortierung der Columns ist typisch Columns enthalten oft values im columnkey, sogar valueless columns möglich! ‚Composite columns‘ erlauben mehrere Werte im columnkey z.B: nach dem Muster <Timeuuid | Eventtype | Event> SELECT FIRST 3 REVERSED ‘timestamp200’ … ‘timestamp100’ FROM adventures; NoSQL-Seminar Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 13 / 16 29. 11.2013 PRIMARY KEY () Statement: CREATE TABLE employee ( empId int, deptId int, … PRIMARY KEY(empId, deptId)); identifiziert einen Datensatz eindeutig anhand der Kombination (empId, deptId) ABER: empId wird gleichzeitig zum PARTITION KEY -> Speicherung auf Node xy deptId und folgende columns werden zu CLUSTERING COLUMNS absteigender Prio Bedeutung des Statements: Alle rows werden auf Node für Keyspace ‚empId‘ geordnet nach der ‚deptId‘ gespeichert -> Auswahl des PRIMARY KEYS passend zu Anwendungsfall / typischen queries -> Auch ein SELECT-Statement mit attr1, attr3 ohne attr3 wird nicht funktionieren! NoSQL-Seminar Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 14 / 16 29. 11.2013 Indizes Das funktioniert nicht: SELECT * FROM employee WHERE fullName=‘parker’; es sei denn fullName wurde explizit indiziert Standardfall: Queries nur über den Rowkey Wenn query über non-rowkey sein muss: CREATE INDEX ON employee(fullName); Erstellt einen ‚secondary index‘, keinen zweiten rowkey oder ähnliches NoSQL-Seminar Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 15 / 16 29. 11.2013 Time To Live Columns können eine TTL bekommen INSERT INTO employee (empId, deptId, firstName, lastName) VALUES (104, 15, ‘Peter’, ‘Parker’) USING TTL 60; Nach 30 Sekunden die verbleibende Zeit überprüfen: SELECT TTL(empId) FROM employee WHERE … NoSQL-Seminar ttl(empId) -----------30 Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 16 / 16 29. 11.2013 Time To Live That´s it… Columns können eine TTL bekommen INSERT INTO employee (empId, deptId, firstName, lastName) VALUES (104, 15, ‘Peter’, ‘Parker’) USING TTL 60; Nach 30 Sekunden die verbleibende Zeit überprüfen: SELECT TTL(empId) FROM employee WHERE … NoSQL-Seminar ttl(empId) -----------30 Verfasser/in Florian Schaak Webadresse, E-Mail oder sonstige Referenz Seite 16 / 16