Cassandra Query Language (CQL)

Werbung
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
Herunterladen