Bazy rodziny kolumn
Model danych
• Rodzina kolumn
• Tabela to kolekcja podobnych wierszy (niekoniecznie identycznych)
• Wiersz
• Wiersz to kolekcja kolumn columns
– Powinien agregować porcję danych, która jest odczytywana razem
• Posiada przyporządkowany unikalny identyfikator (klucz) wiersza
• Kolumna
• Kolumna składa się z nazwy kolumny i wartości w kolumnie (oraz potencjalnie innych metadanych)
• Agreguje wartości skalarne, ale również płaskie zbiory, listy czy mapy są dopuszczalne
Baza rodziny kolumn
• http://cassandra.apache.org/
• Właściwości
• Open-source, wysoka dostępność, skalowalność liniowa, partycjonowanie poziome (ang. sharding), replikacja typu peer-to-peer, regulowana spójność, wsparcie dla MapReduce
• Zarządzany przez Apache Software Foundation
• Pierwotnie stworzony przez Facebook
• Zaimplementowany w języku Java
• Systemy operacyjne: dostępne dla wielu platform
• Pierwsze wydanie w 2008 r.
Struktura bazy danych
Instancja → przestrzeń kluczy → tabele → wiersze → kolumny
• Przestrzeń kluczy
• Tabela (rodzina kolumn)
• Kolekcja (podobnych) wierszy
– Wiersze nie muszą mieć dokładnie tych samych kolumn
• Schemat tabeli musi być podany, ale może być modyfikowany później
• Wiersz
• Kolekcja kolumn
• Każdy wiersz jest jednoznacznie identyfikowalny przez wymagany klucz główny
• Kolumna
• Para klucz-wartość + inne metadane
Wartości kolumn
• Puste
null
• Wartości atomowe
Natywne typy danych ciągi znaków, liczby, daty itp.
• Krotki (ang. Tuples)
– Analogia do kolekcji deksryptorów
Typy definiowane przez użytkownika (UDT)
– Zbiór pól dowolnego typu
• Kolekcje
Listy, zbiory, mapy
– Zagnieżdżone krotki, typy definiowane przez
użytkownika, czy kolekcje są dozwolone, jednakże tylko w trybie frozen.
Kolekcje:
• Lista = uporządkowana kolekcja wartości.
• Porządek zależy od pozycji danej.
• Wartości nie muszą być unikalne.
• Zbiór = kolekcja unikalnych wartości
• Wartości są wewnętrznie uporządkowane
• Mapa = kolekcja par klucz-wartość
• Klucze muszą być unikalne
• Pary są wewnętrznie uporządkowane na podstawie kluczy
dane rok filmy
( 'S', 'Stallone' ) 1964 { 'Rambo', 'Niezniszczalni' }
Tabela aktorzy
id 'stallone'
'schwarzenegger ' dane rok
( 'A', 'Schwarzenegger' ) 1966 filmy
{ 'Niezniszczalni', 'Pamięć absolutna', 'Conan' }
dane rok filmy
( 'W', 'Snipes' ) 1973 { 'Pasażer 57' } 'snipes'
'norris' dane rok filmy
( 'C', 'Norris' ) 1936 { 'Strażnik Teksasu' }
Tabela filmy
tytul rok aktorzy gatunki
'Nietykalni' 2011 null [ 'komedia', 'dramat' ]
tytul rezyser rok
'Niezniszczalni' ( 'Sylvester', 'Stallone' ) 2010
wlasciwosci aktorzy
{ dlugosc: 100 } { 'stallone': 'Sylvester', 'jet': ‚Li' } Id
'nietykalni'
'niezniszczalni'
'tombraider' tytul rok
'Tomb Raider’ 2001
'hobbit' tytul rok actors gatunki
'Hobbit' 2012 {} [ 'fantasy', 'przygoda' ]
• Dodatkowe dane związane z…
-
Całą kolumną w przypadku atomowych danych, lub poszczególnego, indywidualnego elementu kolekcji• Czas życia (ang. Time-to-live (TTL))
- Po pewnym czasie (określonej liczbie sekund) dana kolumna lub element jest automatycznie niszczony
• Czas modyfikacji (ang. Timestamp)
- Czas dokonania ostatniej modyfikacji
- Przyporządkowywany automatycznie lub ręcznie
• Zarówno porcja „zwykłych danych” jak i dodatkowe mogą być przedmiotem zapytań.
- Nie dotyczy to kolekcji i jej elementów
CQLSH
• Interaktywna konsola do wydawania komend
• bin/cqlsh
• Wykorzystuje CQL (Cassandra Query Language) Sterowniki klienckie:
• Dostarczone przez społeczność
• Dostępne dla wielu różnych języków programowania
np.
Java, Python, Ruby, PHP, C++, Scala, Erlang, itp.CQL = Cassandra Query Language
• Deklaratywny język zapytań
Zainspirowany przez SQL
• Wyrażenia DDL
CREATE KEYSPACE– stwórz nową przestrzeń kluczy CREATE TABLE– stwórz nową tabelę
• Wyrażenia DML
SELECT– wybiera wiersze z pojedynczej tabeli INSERT– dodaje wiersze do tabeli
UPDATE– aktualizuje kolumny w wierszach DELETE– usuwa wiersze z tabeli
CREATE KEYSPACE
CREATE KEYSPACE CREATE KEYSPACE
IF NOTNOT EXISTSEXISTS
keyspace name keyspace name
WITHWITH option nameoption name = option valueoption value
• Tworzy nową przestrzeń kluczy
• Opcja Replication jest obowiązkowa
SimpleStrategy (tylko jeden poziom replikacji) NetworkTopologyStrategy
(indywidualny poziom replikacji dla każdego centrum danych)
CREATE KEYSPACE
WITH replication = {'class'moviedb: 'SimpleStrategy', 'replication_factor': 3}
Przestrzeń kluczy = Baza danych
USE keyspace name
USE
• Zmienia aktualnie używaną przestrzeń kluczy
USE keyspace name
DROP KEYSPACE
• Usuwa przestrzeń kluczy, wszystkie jej tabele i dane.
DROP
DROP KEYSPACEKEYSPACE keyspace namekeyspace name
IF EXISTSEXISTS
ALTER KEYSPACE
• Modyfikuje opcje związane z daną przestrzenią kluczy
CREATE TABLE
• Tworzy nową tabelę w aktualnej przestrzeni kluczy
• Każda tabela musi mieć dokładnie 1 klucz główny podany
• Żadna z kolumn nie jest wymagana (poza kluczem głównym)
Przykłady tabel aktorzy i filmy
CREATE TABLE aktorzy ( id TEXT PRIMARY KEY, dane TUPLE<TEXT, TEXT>, rok SMALLINT,
filmy SET<TEXT>
)
CREATE TABLE filmy( id TEXT,
tytul TEXT,
rezyser TUPLE<TEXT, TEXT>, rok SMALLINT,
aktorzy MAP<TEXT, TEXT>, gatunki LIST<TEXT>,
kraje SET<TEXT>, wlasciwosci details, PRIMARY KEY(id) )
Klucze główne posiadają dwie części
• Obowiązkowy klucz partycjonujący
Przynajmniej 1 kolumna
Definiuje jak poszczególne wiersze są dystrybułowane na partycje
• Opcjonalne kolumny grupujące
• Definiują kolejność w jakiej poszczególne wiersze są lokalnie przechowywane
Definicja klucza głównego na poziomie kolumny
• Dana kolumna (pojedyncza) staje się kluczem partycjonującym
• Nie ma opcjonalnych kolumn grupujących
Definicja klucza głównego na poziomie tabeli
• Pierwsza kolumna/wszystkie kolumny (w nawiasach klamrowych) stają się kluczem partycjonującym
• Wszystkie pozostałe kolumny (jeśli są) przyjmują rolę kolumn grupujących
PRIMARY
PRIMARY KEYKEY (
column name column name
( column name
,
) , column name
)
DROP TABLE
• Usuwa tabelę wraz z danymi które zawiera
DROP
DROP TABLETABLE table nametable name
EXISTS IF EXISTS
TRUNCATE TABLE
• Zachowuję tabelę, ale usuwa zawarte w niej dane
TRUNCATE TRUNCATE
TABLE TABLE
table name table name
ALTER TABLE
• Umożliwia zmianę, dodanie bądź usunięcie kolumn tabeli
Typy kolumn
• Natywne typy
• Krotki
• Kolekcje: listy, zbiory, mapy
• Typy definiowane przez użytkownika
native type native type
TUPLE
TUPLE < typetype
,
>
LISTLIST < typetype >
SETSET < typetype >
MAP typetype , typetype >
user defined type MAP <
user defined type
Natywne typy danych
• tinyint, smallint, int, bigint
Liczby całkowite ze znakiem(1B, 2B, 4B, 8B)
• varint
Liczba całkowita o ustalonej precyzji
• decimal
Liczba rzeczywista o ustalonej precyzji
• float, double
Liczby rzeczywiste (4B, 8B)
• boolean
Wartości boolowskie: true i false
Natywne typy danych
• text, varchar
Ciąg znaków wykorzystujący kodowanie UTF8
Wyrażony w pojedynczych apostrofach (nie cudzysłów)
• ascii
Ciąg znaków wykorzystujący kodowanie ASCII
• date, time, timestamp
Data, czas i timestamp
Np. '2016-12-05', '2016-12-05 09:15:00', 1480929300
Natywne typy danych
• counter– 8B liczba całkowita (ze znakiem)
Wpiera tylko 2 operacje: inkrementacje i dekrementacje –
tj. nie można ustawić konkretnej wartości licznika
Restrykcje:
– Liczniki nie mogą być częścią klucza głównego
– Albo wszystkie kolumny (poza kluczem głównym) są licznikami, albo żaden z nich
– Czas życia (TTL) nie jest wspierany
• blob– dowolny zestaw danych (binarnych)
• inet– adres IP (zarówno IPv4 jak i IPv6)
• Inne: uuid
https://cassandra.apache.org/doc/latest/cql/types.html
TUPLE type
Kropki (ang. Tuples)
• Deklaracja
TUPLE < type >
,
• Literały
(
term term
,
)
Np. ( 'Numer', '123-456-789' )
SET type
termterm
,
Zbiory
• Deklaracja
SET < type >
• Literały
{ }
Np. { 'Niezniszczalni', 'Rambo' }
LIST type
term
Listy
• Deklaracja
LIST < type >
• Literały
[ ]
term
,
Np. [ 'komedia', 'dramat' ]
MAP type type
Mapy
• Deklaracja
MAP < type , type >
• Literały
{ }
Np. { 'reżyser': 'Sylvester Stallone' }
CREATE TYPE type name field name
Typy definiowane przez użytkownika (UDT)
• Definicja
CREATE TYPE ( typetype
,
)
field name term
E.g. CREATE TYPE details ( dlugosc SMALLINT, adnotacja TEXT )
• Literały
{ }
: term
,
Np. { dlugosc: 100 }
Mogą być frozen
Wyrażenie SELECT
• Wybiera pasujące wiersze z pojedynczej tabeli
SELECT clause
SELECT clause FROM clauseFROM clause
WHERE clause WHERE clause
GROUP BY clause
GROUP BY clause ORDER BY clauseORDER BY clause LIMIT clauseLIMIT clause
ALLOW
ALLOW FILTERINGFILTERING
Klauzule dozwolone w wyrażeniu SELECT:
• SELECT– kolumny lub wartości które powinny się pojawić w rezultacie
• FROM– określenie pojedynczej tabeli do której się odnosi zapytanie
• WHERE– warunki filtrowania nałożone na wiersze tabeli
• GROUP BY– kolumny użyte do grupowania wierszy
• ORDER BY– kryteria definiujące kolejność wierszy w rezultacie
• LIMIT– liczba wierszy jaka powinna być podana w rezultacie Przykład
SELECT id, tytul, aktorzy FROM filmy
WHERE rok = 2011 AND gatunki CONTAINS 'komedia'
Klauzula FROM clause
• Definiuje pojedynczą tabelę do której będą wysyłane zapytania
Z aktualnej/wybranej przestrzeni kluczy
• Złączenie wielu tabel nie jest możliwe
FROMFROM
keyspace name
keyspace name .
table name table name
Klauzula WHERE
• Jedno lub więcej kryteriów jakie wiersz musi spełniać by zostać dołączony do rezultatu zapytania
WHERE relation
AND WHERE relation
AND
• Tylko proste warunki mogą zostać zapisane oraz nie wszystkie relacje/kryteria są dozwolone:
Tylko kolumny wchodzące w skład klucza głównego mogą zostać uwzględnione
Chyba, że istnieją pomocnicze struktury indeksujące Problem w przypadku niektórych relacji
Klauzula WHERE : relacje
column name
column name
term
term
CONTAINS
CONTAINS KEY column name
(
=
) !=
, <
<=
=>
>
IN ( )
,
term
Klauzula WHERE: relacje
• Porównanie
=, !=, <, <=, =>, >
• IN
Zwraca true jeśli wartość zawiera się w enumerowanej strukturze
• CONTAINS
Może być używana w kolekcjach (listy, zbiory, mapy) Zwraca true, gdy kolekcja zawiera danych element
• CONTAINS KEY
Może być używany tylko dla map
Zwraca true jeśli mapa zawiera dany klucz
Klauzula SELECT
• Definiuje kolumny lub wartości jakie mają być uwzględnione w rezultacie
* Oznacza wszystkie kolumny Aliasy definiowane są przez AS
SELECT SELECT
DISTINCT
*
selector selector
AS identifier
,
• DISTINCT – powielone wiersze są usuwane
Klauzula SELECT:
• COUNT(*)
Liczba wierszy w grupie (patrz GROUP BY)
• WRITETIME i TTL
Wybiera czas modyfikacji/ pozostały czas życia danej kolumny
Nie może zostać użyte na kolekcji i jej elementach
Nie może zostać użyte w innych klauzulach(np. WHERE)
Klauzula ORDER BY
• Definiuje kolejność wierszy zwróconych w rezultacie
• Tylko uporządkowania wyznaczane przez kolumny grupujące są dozwolone!
ORDER BY
ORDER BY column namecolumn name
ASC
DESC ASC
DESC
,
Klauzula LIMIT
• Ogranicza liczbę wierszy w zwróconym rezultacie
LIMIT
LIMIT integerinteger
Klauzula GROUP BY
• Grupuje wiersze w tabeli na podstawie określonych kolumn
• Tylko grupowania na kolumnach klucza głównego są dozwolone!
GROUP BY
GROUP BY column namecolumn name
,
• Jeżeli w klauzule SELECT zostałaby wymieniona bezpośrednio kolumna, która nie bierze udziału w grupowaniu (tzn. nie
będąca objętą funkcją agregującą), zawsze tylko pierwsza
wartość zostanie zwrócona.
Klauzula GROUP BY: agregacje
• Natywne agregacje
COUNT(kolumna)
– Liczba wszystkich wartości w danej kolumnie – Wartości null są ignorowane
MIN(kolumna), MAX(kolumna)
– Minimalna / maksymalna wartość w kolumnie
SUM(kolumna)
– Suma wszystkich wartości w danej kolumnie
AVG(kolumna)
– Średnia arytmetyczna wszystkich wartości w danej kolumnie
• Funkcje agregacyjne definiowane przez użytkownika
Modyfikator ALLOW FILTERING
• Domyślnie, tylko nie-filtrujące zapytania są dozwolone
Tzn. zapytania dla których
Liczba wierszy przeczytanych ∼ liczba wierszy zwróconych Takie zapytania mają przewidywalną złożoność
– Ich czas wykonania jest wprost proporcjonalny do rozmiaru danych
• ALLOW FILTERING umożliwia częściowe filtrowanie
Wyrażenie INSERT
• Wstawia wiersz do danej tabeli
Gdy wiersz o podanym kluczu głównym już istnieje, jest on aktualizowany
• Przynajmniej wartości dla kolumn klucza głównego muszą być określone
• Nazwy kolumn muszą być zawsze podane jawnie
INSERT
INSERT INTOINTO
keyspace name
keyspace name .
table name table name
column name ( column name
,
VALUES
) VALUES ( termterm
,
)
IF NOTNOT EXISTSEXISTS USINGUSING update parametersupdate parameters
Przykład
INSERT INTO filmy (id, tytul, rezyser, rok, aktorzy, gatunki) VALUES ( 'zielonamila',
'Zielona Mila',
('Frank', 'Darabont'), 1999,
{ 'hanks': 'Tom', 'morse': 'David' }, [ 'komedia', 'dramat' ]
)
USING TTL 86400
Wyrażenie UPDATE
• Aktualizuje wiersze w danej tabeli
Jeżeli wiersze o podanym kluczu jeszcze nie istnieje, zostanie on dodany
• Co najmniej wszystkie kolumny wchodzące w skład
klucza głównego muszą być podane w klauzule WHERE
UPDATE UPDATE
keyspace name
keyspace name .
table name table name
USING
USING update parametersupdate parameters
SETSET assignmen t
assignment
,
WHERE clause WHERE clause
Wyrażenie UPDATE: przypisania
• Określają modyfikacje jakie są dozwolone
• Dozwolone przypisania:
Wartość całej kolumny jest zmieniana
Wartość elementu mapy lub listy jest zmieniana
– Elementy listy są numerowane od 0
• Wartość kolumny zawierającej typ definiowany przez użytkownika jest zmieniana
column name column name
column name [ term
column name . field name ]
= term
Przykład
UPDATEfilmy SET
rok = 2010,
rezyser = ('Sylwester', 'Stallone'),
aktorzy = { 'stallone': 'Barney Ross', 'schwarzenegger': 'Trench' }, gatunki = [ 'akcja' ], kraje = { 'USA' }
WHERE id = 'niezniszczalni'
UPDATEfilmy SET
aktorzy['norris'] = 'Chuck’, gatunki[1] = 'komedia', wlasciwosci.dlugosc = 99 WHERE id = 'niezniszczalni'
Przykład: modyfikacja elementów kolekcji
UPDATEfilmy SET
aktorzy = aktorzy + { 'itie': 'Giselle' }, gatunki = [ 'dramat' ] + gatunki, kraje = kraje + { 'BR' }
WHERE id = 'niezniszczalni' UPDATEfilmy
SET
aktorzy = aktorzy - { 'vicander', ‚west' }, gatunki = gatunki - [ 'dramat', 'sci-fi' ], kraje = kraje - { 'DE' }
WHERE id = 'tombraider'
Parametry UPDATE
• TTL: czas życia
0, null lub pusty dla trwałych wartości
• TIMESTAMP: czas zapisu
TIMESTAMP TIMESTAMP
TTL
integer integer
AND TTL
AND
• Ma to wpływ tylko na nowo - dodane / aktualizowane
wartości
Wyrażenie DELETE
• Usuwa pasujące wiersze /
Zachowuje wiersze, ale usuwa wybrane kolumny / Zachowuje kolumny, ale usuwa elementy kolekcji
lub pola z wartościami definiowanymi przez użytkownika
DELETE DELETE
column name
column name [ term
column name . field name ]
,
FROM clause
FROM clause WHERE clauseWHERE clause