Esempi di query Hive: Order By, Group By & Cluster By
⚡ Riepilogo intelligente
Le query Hive utilizzano le clausole ORDER BY, GROUP BY, SORT BY, CLUSTER BY e DISTRIBUTE BY per ordinare, raggruppare e distribuire le righe tra i reducer, e ciascuna clausola viene illustrata qui su una singola tabella di esempio relativa ai dipendenti.
Hive fornisce un linguaggio di interrogazione di tipo SQL per scopi ETL oltre al Hadoop file system.
Hive Query Language (HiveQL) fornisce un ambiente di tipo SQL all'interno di Hive per lavorare con tabelle, database e query.
A Hive sono associate diverse tipologie di clausole per eseguire diverse tipologie di manipolazione e interrogazione dei dati, e Hive offre connettività JDBC per connessioni più efficienti con nodi esterni all'ambiente.
Le query Hive offrono le seguenti funzionalità:
- Modellazione dei dati, come la creazione di database, tabelle, ecc.
- Funzionalità ETL come ad esempiotractrasformazione e caricamento dei dati nelle tabelle
- Entra a far parte per unire diverse tabelle di dati
- Script personalizzati specifici dell'utente per facilitare la codifica
- Strumento di query più veloce su Hadoop
Creazione della tabella in Hive
Prima di iniziare con l'argomento principale di questo tutorial, creeremo una tabella che useremo come riferimento per le sezioni successive.
In questo tutorial, creeremo la tabella "employees_guru" con 6 colonne, come mostrato nello screenshot qui sotto.
Dalla schermata sopra,
- Stiamo creando la tabella "employees_guru" con 6 colonne contenenti i valori Id, Nome, Età, Indirizzo, Stipendio e Dipartimento, che appartengono ai dipendenti presenti nell'organizzazione "guru".
- In questa fase carichiamo i dati nella tabella employees_guru. I dati che andremo a caricare si trovano nel file Employees.txt.
Ordina per query
La sintassi ORDER BY in HiveQL è simile alla sintassi di ORDER BY in SQL Lingua.
ORDER BY è la clausola che utilizziamo con l'istruzione “SELECT” in Query alveare Per ordinare i dati. Utilizza le colonne delle tabelle Hive per ordinare i valori delle colonne specifiche indicate con ORDER BY, e la query visualizza i risultati in ordine crescente o decrescente di tali valori.
Se il campo ORDER BY menzionato è una stringa, il risultato viene visualizzato in ordine lessicografico. Nel back-end, l'intero set di risultati deve essere passato a un singolo reducer.
Quel singolo riduttore rende anche ORDER BY costoso su una tabella grande, quindi in modalità rigorosa (hive.mapred.mode=strictHive rifiuta un ORDER BY che non contiene una clausola LIMIT.
Lo screenshot qui sotto mostra la query ORDER BY e le relative righe ordinate.
Dallo screenshot qui sopra possiamo osservare quanto segue:
- Si tratta di una query eseguita sulla tabella "employees_guru" con la clausola ORDER BY e "Department" come nome della colonna definita nella clausola ORDER BY. "Department" è una stringa, quindi i risultati vengono visualizzati in ordine lessicografico.
- Questo è l'output effettivo della query. I risultati vengono visualizzati in base alla colonna Dipartimento, ad esempio AMMINISTRAZIONE, Finanza e così via, in ordine.
Query:
SELECT * FROM employees_guru ORDER BY Department;
Raggruppa per query
La clausola GROUP BY utilizza colonne sulle tabelle Hive per raggruppareping i valori della colonna specifica menzionati con GROUP BY, e la query seleziona e visualizza i risultati raggruppati in base a tali valori.
Ad esempio, la schermata seguente mostra il numero totale di dipendenti presenti in ciascun reparto. In questo caso, il valore di raggruppamento è "Reparto".
Dallo screenshot qui sopra, possiamo osservare quanto segue:
- Si tratta della query eseguita sulla tabella "employees_guru" con la clausola GROUP BY e Department come nome della colonna GROUP BY definita.
- L'output mostrato qui indica il nome del dipartimento e il numero di dipendenti nei diversi dipartimenti. Tutti i dipendenti appartenenti a uno specifico dipartimento sono raggruppati e visualizzati, quindi ogni riga del risultato corrisponde al nome del dipartimento con il numero totale di dipendenti.
Query:
SELECT Department, count(*) FROM employees_guru GROUP BY Department;
Ordina per
La clausola SORT BY opera sui nomi delle colonne delle tabelle Hive per ordinare l'output. Possiamo utilizzare DESC per l'ordinamento decrescente e ASC per l'ordinamento crescente.
L'opzione SORT BY ordina le righe prima di passarle al reducer, garantendo così l'ordinamento all'interno di ciascun reducer anziché nell'intero risultato. L'ordinamento dipende sempre dal tipo di colonna.
Ad esempio, se il tipo di colonna è numerico, l'ordinamento avviene in ordine numerico, mentre se il tipo di colonna è stringa, l'ordinamento avviene in ordine lessicografico.
Lo screenshot qui sotto mostra la query SORT BY utilizzando DESC.
Dallo screenshot qui sopra possiamo osservare quanto segue:
- Si tratta della query eseguita sulla tabella "employees_guru" con la clausola SORT BY e "Id" come nome della colonna di ordinamento definita. Abbiamo utilizzato la parola chiave DESC.
- L'output visualizzato è quindi in ordine decrescente di "Id".
Query:
SELECT * from employees_guru SORT BY Id DESC;
Cluster By
CLUSTER BY viene utilizzato come alternativa sia alla clausola DISTRIBUTE BY che alla clausola SORT BY in HiveQL.
La clausola CLUSTER BY viene utilizzata sulle tabelle presenti in Hive. Hive utilizza le colonne specificate in CLUSTER BY per distribuire le righe tra i reducer, e le colonne CLUSTER BY vengono utilizzate da più reducer. Inoltre, garantisce l'ordinamento dei valori presenti in questi reducer.
Ad esempio, la clausola CLUSTER BY è menzionata nel nome della colonna Id della tabella employees_guru. L'esecuzione di questa query fornisce risultati a più reducer nel back-end, ma nel front-end rappresenta una clausola alternativa sia per SORT BY che per DISTRIBUTE BY.
Questo è il processo di back-end che avviene quando eseguiamo una query con SORT BY, GROUP BY o CLUSTER BY nell'ambito del framework MapReduce. Quindi, se vogliamo memorizzare i risultati in più reducer, utilizziamo CLUSTER BY.
La grammatica CLUSTER BY accetta solo nomi di colonna, quindi non è possibile associarvi ASC e DESC; un risultato decrescente richiede DISTRIBUTE BY con un SORT BY … DESC separato.
Lo screenshot qui sotto mostra la query CLUSTER BY sull'ID.
Dallo screenshot qui sopra otteniamo le seguenti osservazioni:
- Si tratta della query che applica la clausola CLUSTER BY al valore del campo Id. In questo caso, verrà eseguito un ordinamento in base ai valori di Id.
- Visualizza i valori di Id e Name presenti in employees_guru in ordine ordinato.
Query:
SELECT Id, Name from employees_guru CLUSTER BY Id;
Distribuisci per
La clausola DISTRIBUTE BY viene utilizzata sulle tabelle presenti in Hive. Hive utilizza le colonne specificate in DISTRIBUTE BY per distribuire le righe tra i reducer, in modo che tutte le righe che condividono lo stesso valore nella colonna DISTRIBUTE BY vengano assegnate allo stesso reducer.
- Garantisce che ciascuno degli N riduttori riceva un non-sovrapposizioneping insieme dei valori della colonna
- Non ordina l'output di ciascun reducer e non è garantito che le righe corrispondenti siano adiacenti.
Lo screenshot qui sotto mostra la query DISTRIBUTE BY sull'ID.
Dallo screenshot qui sopra, possiamo osservare quanto segue:
- La clausola DISTRIBUTE BY viene eseguita sull'ID della tabella "employees_guru".
- L'output mostra ID e Nome. Nel back-end, le righe con lo stesso ID vengono indirizzate allo stesso reducer.
Query:
SELECT Id, Name from employees_guru DISTRIBUTE BY Id;
Le quattro clausole sono facili da confondere, quindi la tabella seguente le confronta.
| Clausola | riduttori | Ciò che garantisce |
|---|---|---|
| ORDINATO DA | Un | Ordine totale sull'intero risultato |
| ORDINAMENTO | Molti | Ordinare solo all'interno di ciascun riduttore |
| DISTRIBUITO DA | Molti | La stessa chiave raggiunge lo stesso riduttore, non ordinato |
| GRUPPO PER | Molti | DISTRIBUIRE PER più ORDINA PER, crescente |







