Al fine di gestire le proprie analisi, Hive deve poter disporre di meccanismi per l'inserimento di dati (sia singolarmente
sia in massa) e per la loro esportazione. In questa lezione, affrontiamo l'argomento interessandoci prima al comando
INSERT
e, successivamente, a quelli relativi a migrazioni di informazioni da e verso database Hive.
Negli esempi che seguono supporremo di disporre di una tabella, di nome transazioni, inclusa nel database
banca. I comandi HiveQL per la sua creazione sono i seguenti:
DROP DATABASE IF EXISTS banca CASCADE;
CREATE DATABASE banca;
USE banca;
CREATE TABLE transazioni
(data DATE,
importo FLOAT,
codice STRING,
descrizione STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ';';
Ogni riga rappresenta un'operazione bancaria avvenuta su un conto corrente ed è costituita da quattro campi: "data" in formato yyyy-mm-dd (anno su quattro cifre, mese e giorno su due), "importo"
come numero in virgola, e due stringhe, rispettivamente "codice" e "descrizione".
Possiamo scrivere l'intero codice in uno script da eseguire con il tool da riga di comando hive seguito dall'opzione
-f
:
hive -f hive_importa_dati.sql
dove hive_importa_dati.sql è il nome dello script. Alle prime righe, si nota un comando DROP DATABASE
che serve solo a
creare un nuovo database da zero.
Inserimento di dati
L'inserimento di dati viene attuato mediante il comando INSERT ... VALUES
. Per registrare un'operazione bancaria
eseguita in data 12 maggio 2014, supponiamo un versamento (codice VS), possiamo utilizzare questo comando:
INSERT INTO banca.transazioni VALUES ('2014-05-12', 300, 'VS', 'Versamento di una somma in contanti')
L'operazione produrrà una nuova riga all'interno della tabella che da questo momento sarà disponibile per le
interrogazioni. L'inserimento può essere multiplo specificando più tuple di dati, separate da virgole, dopo la parola chiave VALUES
:
INSERT INTO banca.transazioni VALUES ('2014-05-12', 300, 'VS', 'Versamento di una somma'),
('2015-01-12', -300, 'PC', 'Prelievo bancomat'), ('2015-02-04', -128, 'PB', 'Pagamento bancomat')
In base a come lo si è installato, Hive produrrà un output diverso. Se, ad esempio, lo utilizziamo con Hadoop in
MapReduce (al giorno d'oggi esistono alternative più efficienti), otterremo in output la spiegazione in dettaglio del
procedimento MapReduce applicato.
Caricare dati da file
Considerando le moli di dati che Hive tratta e le finalità che si pone, l'inserimento di singoli dati non è pienamente
adeguato né tanto meno sufficiente. Un tipo di operazione molto più comune è l'importazione massiva di dati in una tabella.
Il comando chiamato in causa in queste situazioni è LOAD DATA
ed è il prossimo argomento che sperimentiamo.
I dati che importiamo provengono da un file CSV
in cui ogni riga segue il formato specificato nello schema della tabella. Ecco alcune righe di esempio:
2018-01-24;1000;AS;Stipendio gennaio
2018-01-25;-250;BA;Riscaldamento rata 3
2018-02-01;-300;PC;Prelievo bancomat 101
2018-02-25;1000;AS;Stipendio febbraio
Impartiamo il comando LOAD DATA
nel seguente modo:
LOAD DATA LOCAL INPATH 'dati.csv' INTO TABLE transazioni;
Abbiamo così richiesto di:
- caricare dati (
LOAD DATA
) - dal file locale dati.csv (
LOCAL INPATH 'dati.csv'
) - importandoli nella tabella transazioni (
INTO TABLE transazioni
)
Il file come detto è stato individuato su percorso locale ma eliminando la parola chiave LOCAL
se ne cercherà la
presenza in HDFS. Al termine dell'operazione, se ne potrà verificare la riuscita invocando una query (argomento
approfondito nel seguito della guida):
SELECT * FROM transazioni
Esportazioni di dati
I dati inseriti in una tabella possono essere esportati in una cartella collocata nel sistema HDFS.
Per farlo si può usare il comando EXPORT TABLE
. Supponiamo, ad esempio, di voler
estrarre in un file CSV tutti i dati inseriti nella tabella transazioni del database banca:
EXPORT TABLE banca.transazioni TO '/tmp/copia';
Si noti che l'indirizzo si riferisce ad un percorso interno a HDFS che deve essere racchiuso tra apici. Inoltre
il percorso deve indicare una cartella, non un file. Questa, come detto, sarà collocata in HDFS e conterrà a sua volta una sottocartella
data in cui sarà salvato il file dati.csv.
Potremo verificare l'esistenza del contenuto tramite il client hdfs con il comando:
hdfs dfs -ls /tmp/copia/data
Importazioni di dati
Analogamente a quanto visto al paragrafo precedente possiamo importare in una tabella tutti i file contenuti in una cartella
mediante la direttiva IMPORT TABLE
. Se ad esempio volessimo creare una tabella,
ancora non esistente, nel database banca, attingendo direttamente ai dati presenti in /tmp/copia (percorso
inteso come HDFS) potremmo fare quanto segue:
IMPORT TABLE copia FROM '/tmp/copia';
ove supporremo che /tmp/copia sia una collocazione di file su HDFS. Nel database sarà creata
la tabella ed otterremo un output di questo tipo:
Copying data from hdfs://localhost:9000/tmp/copia/data
Copying file: hdfs://localhost:9000/tmp/copia/data/dati.csv
Loading data to table banca.copia
che certificherà la correttezza delle operazioni. Il comando IMPORT TABLE
rappresenta il giusto complemento di
EXPORT TABLE
. Con essi potremo gestire operazioni di passaggio di dati tra tabelle e database differenti.