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

Raggruppamento e ordinamento

Impariamo ad implementare le operazioni di raggruppamento ed ordinamento, utilizzando il linguaggio di interrogazione di Hive.
Impariamo ad implementare le operazioni di raggruppamento ed ordinamento, utilizzando il linguaggio di interrogazione di Hive.
Link copiato negli appunti

Al fine di ottenere risultati soddisfacenti con le query, è necessario saper ordinare i dati e raggrupparli. La prima operazione
permette di ottenere i risultati in un ordine specifico basato sul valore di uno o più campi. Ciò assume un particolare significato
soprattutto in congiunzione con la parola chiave LIMIT, di cui abbiamo già trattato,
che permette di scegliere quanti elementi mostrare dopo averli ordinati. L'ordinamento è sempre un'operazione onerosa in termini computazionali, specialmente in ambito Big Data,
ma fornendolo unitamente alla query, grazie all'ottimizzazione di Hive, il suo impatto sarà limitato al massimo. Per quanto riguarda il
raggruppamento ci troviamo di fronte ad una delle operazioni più nevralgiche per eseguire elaborazioni. Con essa potremo suddividere in gruppi
i record individuati grazie ai valori presenti in determinati campi, eventualmente elaborati con funzioni. In questa
lezione, vedremo entrambe le operazioni, prima singolarmente e poi combinate in interrogazioni comuni. Tutti gli esempi si riferiranno alla
tabella corso costituita con la seguente definizione:

CREATE TABLE corso
(allievo STRING,
genere STRING,
voto_finale INT,
importo FLOAT,
nascita DATE)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';

Ogni record rapprenta i dati di un allievo di un corso. Per ogni partecipante sono riportati, in ordine: nominativo, sesso,
voto conseguito, importo pagato e data di nascita. Supporremo che la tabella contenga le seguenti poche righe:

Rossi Andrea,M,78,890,1995-05-21
Bianchi Silvia,F,99,670,1999-01-14
Neri Eleonora,F,83,920,1996-08-03
Gialli Paolo,M,92,1020,1992-06-24
Bianchi Vittorio,M,98,750,1993-10-18

Ordinamento

L'ordinamento si esegue mediante la clausola ORDER BY che richiede l'indicazione di almeno un campo in base al quale
sistemare i risultati. La prima query che mostriamo ordina i record per voto finale mostrando in output solo il nominativo dell'allievo ed il voto:

SELECT allievo, voto_finale FROM corso ORDER BY voto_finale

Questo il risultato:

Rossi Andrea       78
Neri Eleonora      83
Gialli Paolo       92
Bianchi Vittorio   98
Bianchi Silvia     99

Come si vede, le righe mostrano voti in ordine partendo dal più basso verso il più alto. Questo perché di default l'ordinamento è effettuato in senso crescente.
Per ottenere i risultati in ordine inverso dovremo specificare la parola chiave DESC:

SELECT allievo, voto_finale FROM corso ORDER BY voto_finale DESC

I risultati questa volta saranno così:

Bianchi Silvia     99
Bianchi Vittorio   98
Gialli Paolo       92
Neri Eleonora      83
Rossi Andrea       78

La clausola ORDER BY può essere utilizzata anche con più campi. Nel seguente esempio, ordiniamo in base al
sesso dell'allievo e al voto finale. L'ordine dei campi che seguono ORDER BY rispecchia la loro priorità: prima vengono
nominati, più importanti sono. Pertanto prioritariamente le righe saranno ordinate per sesso e, a parità di questo, per voto finale conseguito al corso:

SELECT allievo, genere, voto_finale FROM corso ORDER BY genere DESC, voto_finale DESC;

Ecco cosa otteniamo:

Bianchi Vittorio    M     98
Gialli Paolo        M     92
Rossi Andrea        M     78
Bianchi Silvia      F     99
Neri Eleonora       F     83

Come anticipato ad inizio lezione, con LIMIT possiamo restringere il set di risultati alle prime due righe:

SELECT allievo, voto_finale FROM corso ORDER BY voto_finale DESC LIMIT 2;

e questi saranno i due allievi che hanno conseguito il voto finale più alto:

Bianchi Silvia      99
Bianchi Vittorio    98

Raggruppamento

Per eseguire il raggruppamento si sfrutta la clausola GROUP BY, anch'essa seguita dai campi in base ai quali vogliamo
procedere al raggruppamento. Raggruppare significa essenzialmente suddividere i record in gruppi diversi, ognuno dei quali contraddistinto da
medesimi valori nei campi indicati dal GROUP BY. Ad esempio, se scriviamo una query in cui suddividiamo i record per sesso dell'allievo,
possiamo immaginare tutti i record raccolti in due grandi assembramenti: uno dove il campo genere vale sempre 'M' e l'altro con
il valore 'F'. Importante ricordare che nella proiezione - la porzione tra SELECT e FROM che mostra come verranno mostrati i risultati - potremo
citare solo campi nominati dopo il GROUP BY o funzioni di raggruppamento come proprio COUNT:

SELECT genere, COUNT(*) AS quanti FROM corso GROUP BY genere;

I risultati ottenuti ci permetteranno di sapere quante sono le femmine nominate nella tabella e quanti i maschi:

F       2
M       3

Se vogliamo vedere le righe proposte schierate in ordine decrescente possiamo applicare un ORDER BY. Si noti che come
indicazione abbiamo potuto usare quanti ossia non il nome di un campo ma un alias applicato alla funzione COUNT(*):

SELECT genere, COUNT(*) AS quanti FROM corso GROUP BY genere ORDER BY quanti DESC;

Ora, leggendo la prima riga, sapremo se sono più numerosi i ragazzi o le ragazze nel corso che stiamo trattando:

M       3
F       2

Per completare l'esempio ricordiamo che tra le funzioni impiegabili in Hive esistono quelle di carattere condizionale tra cui
IF che richiede tre argomenti: una condizione da valutare che restituirà un valore booleano ed i due valori da riportare nel caso che
essa risulti, rispettivamente, vera o falsa.

SELECT IF(genere='M','MASCHIO','FEMMINA'), COUNT(*) AS quanti FROM corso GROUP BY genere ORDER BY quanti DESC;

In questo modo, non vedremo riportato tra i risultati solo i valori della tabella 'M' e 'F' ma le diciture complete MASCHIO o FEMMINA.

MASCHIO 3
FEMMINA 2

Operazioni di quest'ultimo genere sono estremamente comuni data la cripticità e spesso la diversità dei dati raccolti dalle varie
fonti.

Ti consigliamo anche