Voorbeelden van Hive-query's: ORDER BY, GROUP BY & Cluster By
⚡ Slimme samenvatting
Hive-query's gebruiken de clausules ORDER BY, GROUP BY, SORT BY, CLUSTER BY en DISTRIBUTE BY om rijen te sorteren, groeperen en verdelen over reducers. Elke clausule wordt hier gedemonstreerd aan de hand van een voorbeeldtabel met werknemersgegevens.

Hive biedt een SQL-achtige querytaal voor ETL-doeleinden bovenop de Hadoop bestandssysteem.
Hive Query Language (HiveQL) biedt een SQL-achtige omgeving binnen Hive voor het werken met tabellen, databases en query's.
Verschillende soorten clausules zijn gekoppeld aan Hive om verschillende soorten gegevensmanipulatie en -query's uit te voeren, en Hive biedt JDBC-connectiviteit voor betere verbindingen met knooppunten buiten de omgeving.
Hive-query's bieden de volgende functies:
- Datamodellering, zoals het aanmaken van databases, tabellen, enzovoort.
- ETL-functionaliteiten zoals extracgegevensverwerking, transformatie en het laden van gegevens in tabellen
- Sluit zich aan bij om verschillende gegevenstabellen samen te voegen
- Gebruikerspecifieke aangepaste scripts voor codegemak
- Snellere querytool bovenop Hadoop
Tabel maken in Hive
Voordat we beginnen met het hoofdonderwerp van deze handleiding, maken we eerst een tabel die als referentie kan dienen voor de volgende onderdelen.
In deze handleiding gaan we de tabel "employees_guru" maken met 6 kolommen, zoals de onderstaande schermafbeelding laat zien.
Uit de bovenstaande schermafbeelding,
- We maken de tabel "employees_guru" aan met 6 kolomwaarden: Id, Naam, Leeftijd, Adres, Salaris en Afdeling. Deze waarden behoren toe aan de medewerkers van de organisatie "guru".
- In deze stap laden we gegevens in de tabel employees_guru. De gegevens die we gaan laden, staan in het bestand Employees.txt.
Bestel op aanvraag
De ORDER BY-syntaxis in HiveQL is vergelijkbaar met de ORDER BY-syntaxis in de SQL taal.
ORDER BY is de clausule die we gebruiken met de “SELECT”-instructie in Hive-query's Om gegevens te sorteren. Het gebruikt kolommen in Hive-tabellen om de specifieke kolomwaarden te sorteren die zijn aangegeven met ORDER BY, en de query geeft de resultaten weer in oplopende of aflopende volgorde van die waarden.
Als het genoemde ORDER BY-veld een tekenreeks is, worden de resultaten in lexicografische volgorde weergegeven. Aan de backend moet de volledige resultatenset worden doorgegeven aan één enkele reducer.
Die ene reducer maakt ORDER BY ook duur op een grote tafel, dus in strikte modus (hive.mapred.mode=strictHive weigert een ORDER BY-instructie zonder LIMIT-clausule.
De onderstaande schermafbeelding toont de ORDER BY-query en de gesorteerde rijen.
Uit de bovenstaande schermafbeelding kunnen we het volgende afleiden:
- Dit is de query die wordt uitgevoerd op de tabel "employees_guru" met de ORDER BY-clausule en Department als de gedefinieerde ORDER BY-kolomnaam. "Department" is een tekenreeks, dus de resultaten worden weergegeven op basis van lexicografische volgorde.
- Dit is de daadwerkelijke uitvoer van de query. De resultaten worden weergegeven op basis van de kolom Afdeling, zoals ADMIN, Financiën, enzovoort, in die volgorde.
Query:
SELECT * FROM employees_guru ORDER BY Department;
Groeperen op zoekopdracht
De GROUP BY-clausule gebruikt kolommen in Hive-tabellen voor groepering.ping De query selecteert en toont de resultaten gegroepeerd op basis van de opgegeven kolomwaarden met GROUP BY.
De onderstaande schermafbeelding toont bijvoorbeeld het totale aantal medewerkers per afdeling. Hier gebruiken we 'Afdeling' als GROUP BY-waarde.
Uit de bovenstaande schermafbeelding kunnen we het volgende afleiden:
- Het betreft de query die wordt uitgevoerd op de tabel "employees_guru" met de GROUP BY-clausule en Department als de gedefinieerde GROUP BY-kolomnaam.
- De hier getoonde uitvoer bestaat uit de naam van de afdeling en het aantal medewerkers per afdeling. Alle medewerkers van een specifieke afdeling worden gegroepeerd en weergegeven, zodat elke resultaatregel een afdelingsnaam met het bijbehorende totale aantal medewerkers bevat.
Query:
SELECT Department, count(*) FROM employees_guru GROUP BY Department;
Sorteer op
De SORT BY-clausule sorteert de uitvoer op kolomnamen in Hive-tabellen. We kunnen DESC gebruiken voor sorteren in aflopende volgorde en ASC voor sorteren in oplopende volgorde.
SORT BY sorteert de rijen voordat ze aan de reducer worden aangeboden, waardoor de volgorde binnen elke reducer gegarandeerd is en niet over het hele resultaat. Sortering is altijd afhankelijk van het kolomtype.
Als het kolomtype bijvoorbeeld numeriek is, wordt er in numerieke volgorde gesorteerd, en als het kolomtype tekenreeks is, wordt er in lexicografische volgorde gesorteerd.
De onderstaande schermafbeelding toont de SORT BY-query met DESC.
Uit de bovenstaande schermafbeelding kunnen we het volgende opmaken:
- Dit is de query die is uitgevoerd op de tabel "employees_guru" met de SORT BY-clausule en "Id" als de gedefinieerde kolomnaam voor de SORT BY-clausule. We hebben het trefwoord DESC gebruikt.
- De weergegeven output is dus gesorteerd op "ID" in aflopende volgorde.
Query:
SELECT * from employees_guru SORT BY Id DESC;
Cluster By
CLUSTER BY wordt in HiveQL gebruikt als alternatief voor zowel de DISTRIBUTE BY- als de SORT BY-clausule.
De CLUSTER BY-clausule wordt gebruikt op tabellen in Hive. Hive gebruikt de kolommen in CLUSTER BY om de rijen over de reducers te verdelen, en kolommen in CLUSTER BY worden aan meerdere reducers toegewezen. Het zorgt er ook voor dat de sorteervolgorde van de waarden in die meerdere reducers behouden blijft.
De CLUSTER BY-clausule wordt bijvoorbeeld gebruikt voor de kolomnaam 'Id' in de tabel 'employees_guru'. Het uitvoeren van deze query levert resultaten op voor meerdere reducers aan de back-end, maar aan de front-end is het een alternatieve clausule voor zowel SORT BY als DISTRIBUTE BY.
Dit is het back-endproces wanneer we een query uitvoeren met SORT BY, GROUP BY of CLUSTER BY in het kader van het MapReduce-framework. Dus als we de resultaten in meerdere reducers willen opslaan, kiezen we voor CLUSTER BY.
De CLUSTER BY-grammatica accepteert alleen kolomnamen, dus ASC en DESC kunnen er niet aan worden gekoppeld; een aflopend resultaat vereist DISTRIBUTE BY met een aparte SORT BY … DESC.
De onderstaande schermafbeelding toont de CLUSTER BY-query op Id.
Uit de bovenstaande schermafbeelding kunnen we de volgende observaties maken:
- Dit is de query die de CLUSTER BY-clausule uitvoert op de waarde van het veld Id. Hierdoor worden de Id-waarden gesorteerd.
- Het toont de Id- en Name-waarden die aanwezig zijn in employees_guru in gesorteerde volgorde.
Query:
SELECT Id, Name from employees_guru CLUSTER BY Id;
Verdeel door
De DISTRIBUTE BY-clausule wordt gebruikt op tabellen in Hive. Hive gebruikt de kolommen in DISTRIBUTE BY om de rijen over de reducers te verdelen, zodat alle rijen met dezelfde DISTRIBUTE BY-kolomwaarde naar dezelfde reducer gaan.
- Het zorgt ervoor dat elk van de N reducers een niet-overlappende waarde ontvangt.ping set van de kolomwaarden
- Het sorteert de uitvoer van elke reducer niet, en het is niet gegarandeerd dat overeenkomende rijen naast elkaar komen te staan.
De onderstaande schermafbeelding toont de DISTRIBUTE BY-query op Id.
Uit de bovenstaande schermafbeelding kunnen we het volgende afleiden:
- De DISTRIBUTE BY-clausule wordt uitgevoerd op de Id van de tabel “employees_guru”.
- De uitvoer toont ID en naam. Aan de achterkant worden rijen met dezelfde ID naar dezelfde reducer gestuurd.
Query:
SELECT Id, Name from employees_guru DISTRIBUTE BY Id;
De vier clausules zijn gemakkelijk te verwarren, daarom worden ze in de onderstaande tabel vergeleken.
| Clausule | Verlopen | Wat het garandeert |
|---|---|---|
| BESTELLING DOOR | One | Totale bestelling over het hele resultaat |
| SORTEER OP | Veel | Bestellen kan alleen binnen elke reduceerunit. |
| DISTRIBUTIE DOOR | Veel | Dezelfde sleutel komt bij dezelfde reducer terecht, ongesorteerd. |
| CLUSTER DOOR | Veel | DISTRIBUEREN OP plus SORTEREN OP, oplopend |






