Introduzione
Nella terminologia di Hive, le tabelle esterne sono tabelle non gestite con Hive. Il loro scopo è facilitare l'importazione di dati da un file esterno nel metastore.
I dati della tabella esterna vengono archiviati esternamente, mentre il metastore Hive contiene solo lo schema dei metadati. Di conseguenza, l'eliminazione di una tabella esterna non influisce sui dati.
In questo tutorial imparerai come creare, interrogare e rilasciare una tabella esterna in Hive.
Prerequisiti
- Ubuntu 18.04 LTS o successivo
- Accesso alla riga di comando con privilegi sudo
- Apache Hadoop installato e funzionante
- Apache Hive installato e in esecuzione
Nota: Questo tutorial utilizza Ubuntu 20.04. Tuttavia, Hive funziona allo stesso modo su tutti i sistemi operativi. Ciò significa che il processo di creazione, query e eliminazione di tabelle esterne può essere applicato a Hive su Windows, Mac OS, altre distribuzioni Linux, ecc.
Creazione di una tabella esterna in Hive – Spiegazione della sintassi
Quando crei una tabella esterna in Hive, devi fornire le seguenti informazioni:
- Nome del tavolo – Il
create external table
comando crea la tabella. Se nel sistema esiste già una tabella con lo stesso nome, si verificherà un errore. Per evitare ciò, aggiungiif not exists
alla dichiarazione. I nomi delle tabelle non fanno distinzione tra maiuscole e minuscole. - Nomi e tipi di colonne – Proprio come i nomi delle tabelle, i nomi delle colonne non fanno distinzione tra maiuscole e minuscole. I tipi di colonna sono valori come
int
,char
,string
, ecc. - Formato riga – Le righe utilizzano formati SerDe (Serializer/Deserializer) nativi o personalizzati. Il SerDe nativo verrà utilizzato se il formato della riga non è definito o se è specificato come delimitato.
- Carattere di terminazione del campo – Questo è un
char
digitare il carattere che separa i valori della tabella in una riga. - Formato di archiviazione – È possibile specificare formati di archiviazione come file di testo, file di sequenza, file json, ecc.
- Posizione – Questa è la posizione della directory HDFS del file contenente i dati della tabella.
La sintassi corretta per fornire queste informazioni a Hive è:
create external table if not exists [external-table-name] (
[column1-name] [column1-type], [column2-name] [column2-type], …)
comment '[comment]'
row format [format-type]
fields terminated by '[termination-character]'
stored as [storage-type]
location '[location]';
Crea una tabella esterna dell'alveare – Esempio
A scopo di esempio pratico, questo tutorial ti mostrerà come importare dati da un file CSV in una tabella esterna.
Fase 1:prepara il file di dati
1. Crea un file CSV intitolato "countries.csv":
sudo nano countries.csv
2. Per ogni paese nell'elenco, scrivi un numero di riga, il nome del paese, la sua capitale e la sua popolazione in milioni:
1,USA,Washington,328
2,France,Paris,67
3,Spain,Madrid,47
4,Russia,Moscow,145
5,Indonesia,Jakarta,267
6,Nigeria,Abuja,196
3. Salva il file e prendi nota della sua posizione.
Fase 2:importa il file in HDFS
1. Creare una directory HDFS. Utilizzerai questa directory come posizione HDFS del file che hai creato.
hdfs dfs -mkdir [hdfs-directory-name]
2. Importa il file CSV in HDFS:
hdfs dfs -put [original-file-location] [hdfs-directory-name]
3. Usa il -ls
comando per verificare che il file sia nella cartella HDFS:
hdfs dfs -ls [hdfs-directory-name]
L'output mostra tutti i file attualmente nella directory.
Nota: Per ulteriori informazioni su HDFS, fare riferimento a Che cos'è HDFS? Guida al file system distribuito Hadoop.
Fase 3:crea una tabella esterna
1. Dopo aver importato il file di dati in HDFS, avvia Hive e usa la sintassi spiegata sopra per creare una tabella esterna.
2. Per verificare che la creazione della tabella esterna sia andata a buon fine, digitare:
select * from [external-table-name];
L'output dovrebbe elencare i dati dal file CSV che hai importato nella tabella:
3. Se desideri creare una tabella gestita utilizzando i dati di una tabella esterna, digita:
create table if not exists [managed-table-name](
[column1-name] [column1-type], [column2-name] [var2-name], …)
comment '[comment]';
4. Quindi, importa i dati dalla tabella esterna:
insert overwrite table [managed-table-name] select * from [external-table-name];
5. Verificare che i dati siano stati inseriti correttamente nella tabella gestita.
select * from [managed-table-name];
Come eseguire query su una tabella esterna Hive
Per visualizzare tutti i dati memorizzati in una tabella, utilizzerai il select * from
comando seguito dal nome della tabella. Hive offre un ampio elenco di comandi di query per consentirti di restringere le ricerche e ordinare i dati in base alle tue preferenze.
Ad esempio, puoi utilizzare where
comando dopo select * from
per specificare una condizione:
select * from [table_name] where [condition];
Hive produrrà solo le righe che soddisfano la condizione data nella query:
Invece dell'asterisco carattere che sta per "tutti i dati", è possibile utilizzare determinanti più specifici. Sostituzione dell'asterisco con un nome di colonna (come CountryName , dall'esempio sopra) ti mostrerà solo i dati della colonna scelta.
Ecco alcune altre utili funzioni di query e la loro sintassi:
Funzione | Sintassi |
---|---|
Interroga una tabella in base a più condizioni | select * from [table_name] where [condition1] and [condition2]; |
Dati tabella ordini | select [column1_name], [column2_name] from [table_name] order by [column_name]; |
Ordina i dati della tabella in ordine decrescente | select [column1_name], [column2_name] from [table_name] order by [column_name] desc; |
Mostra il conteggio delle righe | select count(*) from [table_name]; |
Come eliminare una tabella esterna Hive
1. L'eliminazione di una tabella esterna in Hive viene eseguita utilizzando lo stesso comando di eliminazione utilizzato per le tabelle gestite:
drop table [table_name];
L'output confermerà il successo dell'operazione:
2. Interrogare la tabella eliminata restituirà un errore:
Tuttavia, i dati della tabella esterna rimangono nel sistema e possono essere recuperati creando un'altra tabella esterna nella stessa posizione.