Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Database

Impariamo ad utilizzare Hive ed il relativo linguaggio HiveQL per gestire i database: dalla creazione alla modifica, fino all'eliminazione.
Impariamo ad utilizzare Hive ed il relativo linguaggio HiveQL per gestire i database: dalla creazione alla modifica, fino all'eliminazione.
Link copiato negli appunti

Una volta acquisita confidenza con i principi fondamentali di Hive e dell'uso della sua
console, si può
iniziare ad interagire con il sistema. Questa fase, tipicamente, rivela in maniera immediata ed
inequivocabile quanto HiveQL sia simile al linguaggio SQL. Non a casa, una
qualche esperienza con database relazionali come MySQL
renderà l'apprendimento praticamente immediato.

I database

Hive utilizza dei database, ma non è a tutti gli effetti un DBMS relazionale. Sfrutta il modello relazionale come paradigma per
l'accesso ai file collocati sui sistemi di storage con cui lavora (HDFS in primis, lo stesso file system distribuito di
Hadoop).
Supponendo di avere a disposizione un'installazione
di Hive su Hadoop, avviamo la console e diamo uno sguardo alla struttura interna.

Mediante il comando:

SHOW DATABASES;

possiamo vedere quanti database contiene l'installazione di Hive. Anche se non abbiamo
svolto alcuna operazione, Hive contiene almeno un database, di nome default.
Infatti, la risposta al precedente comando sarà la seguente:

hive> show databases;
OK
default
Time taken: 0.024 seconds, Fetched: 1 row(s)

È importante tenere sempre a mente la presenza del database default, in quanto talvolta può
creare equivoci utilizzando Hive. Ad esempio, quando a breve creeremo una tabella o invocheremo
operazioni su una di esse, dovremo sempre specificare a quale database appartiene. Altrimenti, Hive
darà per scontato che si trovi in default. Potrebbe capitare, a causa di una svista, di creare la tabella
nel database di default e cercarla in un altro.

Creare un nuovo database

Per creare un nuovo database si ricorre al comando CREATE DATABASE (in alternativa si può
utilizzare CREATE SCHEMA, direttiva sostanzialmente equivalente), fornendone
almeno il nome. In aggiunta, potremo collegarvi un commento e delle proprietà composte da metadati in formato chiave/valore.
Ad esempio, per creare il database "archivio" è sufficiente il seguente comando:

CREATE DATABASE archivio;

Puntando però ad una maggiore completezza, si può scrivere una definizione così:

CREATE DATABASE IF NOT EXISTS archivio
   COMMENT "Salviamo informazioni relative ai nostri dipendenti"
   WITH DBPROPERTIES ("autore"="Gigi","creato"="20/09/2019","articolazione"="ufficio personale");

Qui abbiamo:

  • specificato che il comando va eseguito solo se il database ancora non esiste (IF NOT EXISTS);
  • associato un commento che spiega il motivo della sua creazione (COMMENT);
  • indicato delle proprietà chiave/valore con ulteriori dettagli (WITH DBPROPERTIES).

La conferma della creazione del database si può ottenere dall'output di SHOW DATABASES:

hive> SHOW DATABASES;
OK
archivio
default
Time taken: 0.772 seconds, Fetched: 2 row(s)

Per una maggiore ricchezza di dettagli, possiamo usare il comando DESCRIBE DATABASE:

hive> DESCRIBE DATABASE EXTENDED archivio;
OK
archivio        Salviamo informazioni relative ai nostri dipendenti
hdfs://localhost:9000/warehouse/archivio.db     hduser  USER
{articolazione=ufficio personale, creato=20/09/2019, autore=Gigi}
Time taken: 0.238 seconds, Fetched: 1 row(s)

Notiamo che la descrizione prodotta offre tutte le informazioni da noi specificate, ma anche qualcosa in
più. Sono indicati l'utente proprietario ed il percorso di rete (hdfs://localhost:9000/warehouse/archivio.db)
che rappresenta univocamente la collocazione fisica del database all'interno di HDFS.
L'indirizzo segue la nostra configurazione, in quanto abbiamo il NameNode di HDFS in esecuzione sulla porta TCP/9000 in locale, ed abbiamo specificato che
la cartella dove Hive collocherà i file dovrà essere "warehouse", nella root principale di HDFS. Infine, archivio.db è a sua volta
una cartella che prende il nome del database, aggiungendo il suffisso ".db". Proprio questo dimostra che in realtà Hive usa i suoi database per accedere a dei file.

Modificare un database

Per procedere alla modifica di un database si utilizza ALTER DATABASE. Con tale comando
possiamo eseguire tre generi di operazioni:

  • ALTER DATABASE ... SET DBPROPERTIES: modifica delle proprietà del database;
  • ALTER DATABASE ... SET OWNER: modifica dell'utente proprietario;
  • ALTER DATABASE ... SET LOCATION: modifica della collocazione su HDFS.

Modifichiamo una proprietà, quella relativa all'autore, e aggiungiamone una nuova:

hive> ALTER DATABASE archivio SET DBPROPERTIES ("autore"="Saverio", "modificato"="30/10/2019");
OK
Time taken: 0.542 seconds

L'operazione riesce, come dimostra il seguente output del comando DESCRIBE DATABASE:

hive> DESCRIBE DATABASE EXTENDED archivio;
OK
archivio        Salviamo informazioni relative ai nostri dipendenti
hdfs://localhost:9000/warehouse/archivio.db     hduser  USER
{articolazione=ufficio personale, modificato=30/10/2019, creato=20/09/2019, autore=Saverio}
Time taken: 0.026 seconds, Fetched: 1 row(s)

Cancellare un database

Per cancellare una database, si usa DROP DATABASE. Nel caso in cui si richieda
di eliminare un database non esistente viene restituito un errore che si può evitare con il modificatore
IF EXISTS. Osserviamo il seguente comando:

hive> DROP DATABASE non_esistente;
FAILED: SemanticException [Error 10072]: Database does not exist: non_esistente

Abbiamo provato ad eliminare un database che non esiste ed abbiamo ricevuto un errore.
Ciò non si verifica se ci comportiamo nel seguente modo:

hive> DROP DATABASE IF EXISTS non_esistente;
OK
Time taken: 0.012 seconds

Un altro modificatore essenziale è CASCADE. Hive, di base, può cancellare solo database
vuoti, ma aggiungendo CASCADE in coda al comando verrà eliminato insieme a tutto il suo contenuto.
Supponendo di avere del contenuto nel database archivio, questo è ciò che si verificherà al tentativo di
eliminarlo:

hive> DROP DATABASE archivio;
FAILED: Execution Error ... (message:Database archivio is not empty. One or more tables exist.)

e questo applicando CASCADE:

hive> DROP DATABASE archivio CASCADE;
OK
Time taken: 1.642 seconds

Solo nell'ultimo caso si avrà un'effettiva cancellazione del database.

Il database corrente

Una volta creato un database, potremo creare e modificare oggetti al suo interno. Se ad esempio
vorremo creare la tabella dipendenti nel database archivio dovremo indicare archivio.dipendenti sia al
momento della creazione sia di ogni altra invocazione. Alternativamente, è possibile indicare il
database corrente in una sessione di lavoro utilizzando la parola chiave USE.
Se scrivessimo nella console:

USE archivio;

ogni tabella nominata nei comandi successivi verrebbe riferita a tale database: così facendo
potremmo parlare di archivio come del database corrente.

Ti consigliamo anche