Sunteți pe pagina 1din 32

Integrarea Sistemelor Informatice

Curs 3

Organizarea datelor în baze de date non-


relaţionale.
Conf. Univ. Dr. Diaconita Vlad
Hive
• Echipa Facebook dezvoltă Hive în 2008, ca
răspuns la problemele de procesare lentă a
datelor.
• În prezent, este folosit şi dezvoltat şi de către
alte companii cum ar fi Netflix.
• Motoare de procesare: MapReduce, Apache
Tez, Apache Spark
• Stocarea datelor: fişiere text, RCFile, Hbase
• Stocare metadatelor: implicit în Apache Derby
Hive
• Este o soluție open-source pentru gestionarea
depozitelor de date care rulează într-un mediu
Hadoop.
• Datele în Hive sunt organizate în tabele care
pot fi partiționate în bucăți mai ușor de
gestionat.
• Hive implementează un limbaj de interogare
tip SQL denumit HiveQL.
Hive
• În Hive există două tipuri de tabele: interne
(numite și managed) și externe.
• Cele interne (tipul implicit) sunt create într-un
subdirector din directorul declarat în
parametrul hive.metastore.warehouse.dir din
hive-site.xml (stocat în /etc/hive/2.4.0.0-
169/0/hive-site.xml pentru versiunea folosită
în acest seminar). Implicit acest director este:
/apps/hive/warehouse.
Hive
• Tabelele sunt organizate în baze de date, acestea
fiind mai degrabă un catalog de tabele. Baza de
date implicită este default iar tabelele sale sunt
construite în rădăcina directorului implicit. Putem
crea o nouă bază de date folosind comanda:
– CREATE DATABASE [IF NOT EXISTS]
<nume_baza_de_date>;
• La construirea unei baze de date se va crea un
nou subdirector în directorul implicit.
Hive
• Afișare baze de date:
– SHOW DATABASES;
• Afișare director bază de date:
– DESCRIBE DATABASE <nume_baza_de_date>;
• Selectare bază de date:
– USE <nume_baza_de_date>;
• Afișare tabele din baza de date curentă:
– SHOW TABLES;
• Afișare coloane dintr-o tabelă:
– DESCRIBE <nume_tabela>;
• Stergere tabela:
– DROP NUME_TABELĂ
Hive
• CREATE EXTERNAL TABLE IF NOT EXISTS
tabela1(record string)
• ROW FORMAT DELIMITED
• LINES TERMINATED BY '\n'
• LOCATION '/user/vlad_diac/flume';
Hive
• select * from tabela1 limit 10;
• select INPUT__FILE__NAME,f.* from tabela1 f
limit 3;
• SELECT xpath_int(record,
"/record/PurchaseDate"), xpath_string(record
, "/record/FlightsAvailable") FROM tabela1
limit 30;
Hive - motoare de execuție
MapReduce Tez
set hive.execution.engine=mr; set hive.execution.engine=tez;
Hive
• Construim o funcție definită utilizator (UDF):
– add jar ./pairwise.jar;
– CREATE temporary function pairwise AS
'com.oracle.hive.udtf.PairwiseUDTF';
• SELECT m1, m2, COUNT(*) FROM
market_basket LATERAL VIEW
pairwise (basket) pwise AS m1,m2 GROUP BY
m1,m2;

HiveQL vs Latin
• Limbaj de interogări: HiveQL, care implementează
un subset al standardului SQL. Foloseşte
abordarea schema-on-read
• Limbaj procedural: Pig Latin
– Suportă funcţii definite de utilizator
– Poate apela cod scris în limbaje cum ar fi JRuby,
Jython sau Java
– Se pot include scripturi Pig în alte limbaje
– Util pentru date structurate, semi-structurate şi
nestructurate
HiveQL vs Pig Latin
HiveQL Pig Latin
• select avg(stock_volume) DIV_A = LOAD 'actiuni.csv'
from actiuni where using PigStorage(',')
symbol="IBM". AS (exchange:chararray,
symbol:chararray,
date:chararray, dividend:float);
B = FILTER DIV_A BY
symbol=='IBM';
C = GROUP B BY dividend;
DESCRIBE C;
DUMP C;
Baze de date non-relaţionale (NoSQL)
• Bazele de date non-relaţionale pun la
dispoziţie mecanisme pentru stocarea şi
procesarea datelor care sunt modelate
folosind şi alte abordări decât cea relațională
• Se mai numesc şi baze de date not-only-sql
Când folosim BD NoSQL
• Datele nu se afla pe același server sau in
aceeași rețea
• Multe dintre date nu aparțin firmei
• Volumul este suficient de mare încât nu poate
fi stocat intr-un singur loc
• Nu avem doar date structurate, ci mai ales
semi-structurate sau nestructurate
Dezavantaje NoSQL
• Maturitatea scăzută a anumitor produse
• Suport şi expertiza limitate
• Capabilități limitate de interogare, sunt de
multe ori necesare cunoștințe de programare
• Administrare mai dificila
Tipuri de baze de date NoSQL
• Orientate pe coloane: HBase, Cassandra
• Orientate pe colecții de perechi cheie-valoare:
Oracle NoSQL, Redis
• Orientate pe documente: MongoDB, CouchDB
• Orientate pe cautari: Elasticsearch
• Tip graf: Giraph, MarkLogic
• Multi-model: ArangoDB
– Popularitate: http://db-engines.com/en/ranking
Orientate pe coloane
ROWID IDANG NUME SALARIU
• 101:001;102:002;
001 101 ILIE 5000
103:003;104:004
002 102 MARIA 7000
003 103 ION 5000 • Ilie:001;Maria:002,004;
004 104 MARIA 7000 Ion:003;
• 5000:001,003;
• Se pot păstra mai multe 7000:002,004
versiuni ale unei valori (s-a
adăugat o coloana,
timestamp)
• 5000:t1:001,003;
5000:t2:001;5500:t2:003;700
0:t1:002,004
Orientate pe colecții de perechi cheie-
valoare
• Baza de date este formata dintr-o colectie de
perechi <cheie, valoare>, asemanatoare
tablourilor asociative (in PL/SQL: TYPE nume_tip
IS TABLE OF tip_element [NOT NULL] INDEX BY
[BINARY_INTEGER | PLS_INTEGER |
VARCHAR2(dimendiune)], in Java: hashtables)
• De multe ori, cheile pot conține orice secvență
binară, spre exemplu conținutul unui fișier JPG
• Valorile pot fi șiruri de caractere dar şi liste,
seturi, hash-uri, Bitmaps
Comenzi in Redis
• SET 101 Ion • LPUSH lista a
• SET 102 Maria • LPUSH lista b
• SET Istorie 7 • LPUSH lista c
• INCR Istorie • LRANGE lista 0 1
• X = GET Istorie
• X = x+1
• SET Istorie x
Wide Column Store (HBase)
• Construim tabela clienti cu două familii de
coloane, date_generale și date_particulare:
– create 'clienti' 'date_generale','date_particulare'
• Pentru a adăuga date în tabelă:
– put 'clienti','1','date_generale:prenume','Vlad'
– put 'clienti','1','date_generale:adresa','Bucuresti'
– put 'clienti','1','date_particulare:vip','DA'
– put 'clienti','1','date_particulare:alta_banca','BCR'
Wide Column Store (HBase)
• Suprascriem BRD peste BCR dar datorită
sistemului de versioning se vor păstra ambele
valori.
– put 'clienti','1','date_particulare:alta_banca','BRD'
– put 'clienti','2','date_generale:prenume','Anca'
– put 'clienti','3','date_generale:prenume','Mihai'
Wide Column Store (HBase)
• Pentru a vedea banca la un anume timestamp:
– get
'clienti','1',{COLUMN=>'date_particulare:alta_banca',T
IMESTAMP=>1525975064952 }
• Pentru un interval:
– get
'clienti','1',{COLUMN=>'date_particulare:alta_banca',T
IMERANGE=>[1525975064952,1525975120991 ,VERSI
ONS=>2}
• Pentru a regăsi până la 10 valori (daca păstram 10
valori):
– scan 'clienti',{RAW=>true,VERSIONS=>10}
Wide Column Store (HBase)
• scan 'clienti', { FILTER =>
SingleColumnValueFilter.new(Bytes.toBytes('date_generale'),Bytes.t
oBytes('prenume'),
CompareFilter::CompareOp.valueOf('EQUAL'),BinaryComparator.ne
w(Bytes.toBytes('Anca')))}
• scan 'clienti', {FILTER => "SingleColumnValueFilter('date_generale',
'prenume', =, 'binary:Anca')"}
• scan 'clienti', {FILTER => "SingleColumnValueFilter('date_generale',
'prenume', =, 'regexstring:[AV]')"}
• scan 'clienti', {FILTER => "SingleColumnValueFilter('date_generale',
'prenume', =, 'regexstring:____')"}
Orientate pe colecții de documente
• Sunt proiectate pentru stocarea, interogarea și
gestiunea informațiilor organizate ca
documente
• Pot fi considerate un caz particular a bazelor
de date orientate pe colecții chei-valoare
Tip Graf
• Un graf este alcătuit din noduri (sau vârfuri) și
muchii (sau arce)
• Bazele de date orientate pe grafuri pun accent
pe relații, spre deosebire de cele relaționale
unde accentul este pe date
• Exemplu:
http://oracleofbacon.org/movielinks.php
Reprezentare in BD Graf
Reprezentare in BDR
Actori Distributie
• ID_Actor • Id_Actor1
• Nume_Actor • Id_Actor2

Legaturi
• Pas1
• Pas2
• Pas3
• Pas4
• Pas5
• Lungime
MongoDB
• Folosește o stocare schema-less bazata pe
JSON/BSON
• Documentul JSON conține datele efective,
fiind parțial echivalent cu un rând dintr-o baza
de date
• Documentele au schema dinamica
• Nu oferă suport pentru joncțiuni
• Oferă atomicitate la nivel de document
Comparație cu SQL
SQL MongoDB
Baza de date Baza de date
Tabela Colecție
Rând Document
Coloana Câmp
Index Index
Joncțiuni Încorporare și referentiere
Cheie primara – poate fi specificată Cheie primara – atribuită automat
câmpului _id
Comenzi
> user1 = {FName: "Test", LName: "User", Age:30, Gender: "M",
Country: "US"}
{
"FName" : "Test",
"LName" : "User",
"Age" : 30,
"Gender" : "M",
"Country" : "US"
}
> user2 = {Name: "Test User", Age:45, Gender: "F", Country: "US"}
{ "Name" : "Test User", "Age" : 45, "Gender" : "F", "Country" : "US" }
> db.users.insert(user1)
> db.users.insert(user2)
Comenzi
• db.users.find()
• db.users.update({"Gender":"F"},{$set:{"Country":"
UK"}},{multi:true})
• db.users.remove({"Gender":"M"})
• db.users.find({"Gender":"F"})
• db.users.find({"Gender":"F"}, {"Name":1,"Age":1})
• db.users.find({"Gender":"F"},
{"Name":1,"Age":1}).sort({"Age":1})
• db.users.find({"Gender":"F",$or:[{"Country":"Indi
a"},{"Country":"US"}]}).limit(2)
Vă mulțumesc pentru atenție!

S-ar putea să vă placă și