Exempel på Hive-frågor: Sortera efter, Gruppera efter och Cluster By
⚡ Smart sammanfattning
Hive-frågor använder ORDER BY, GROUP BY, SORT BY, CLUSTER BY och DISTRIBUTE BY-klausuler för att sortera, gruppera och sprida rader över reducerare, och varje klausul demonstreras här i en enda exempeltabell för anställda.

Hive tillhandahåller ett frågespråk av SQL-typ för ETL-ändamål utöver Hadoop filsystem.
Hive Query Language (HiveQL) tillhandahåller en SQL-liknande miljö i Hive för att arbeta med tabeller, databaser och frågor.
Olika typer av klausuler är associerade med Hive för att utföra olika typer av datamanipulation och frågor, och Hive tillhandahåller JDBC-anslutning för bättre anslutningar med noder utanför miljön.
Hive-frågor erbjuder följande funktioner:
- Datamodellering såsom skapande av databaser, tabeller etc.
- ETL-funktioner som t.ex.traction, transformation och laddning av data till tabeller
- Fogar att slå samman olika datatabeller
- Användarspecifika anpassade skript för enkel kod
- Snabbare frågeverktyg ovanpå Hadoop
Skapa tabell i Hive
Innan vi börjar med huvudämnet i den här handledningen kommer vi först att skapa en tabell som ska användas som referens för de följande avsnitten.
Här i den här handledningen ska vi skapa tabellen "employees_guru" med 6 kolumner, som skärmdumpen nedan visar.
Från ovanstående skärmdump,
- Vi skapar tabellen ”employees_guru” med 6 kolumnvärden som Id, Namn, Ålder, Adress, Lön, Avdelning, vilka tillhör de anställda som finns i organisationen ”guru”.
- Här i det här steget laddar vi data till tabellen employees_guru. Data som vi ska ladda placeras i filen Employees.txt.
Beställ efter fråga
ORDER BY-syntaxen i HiveQL liknar syntaxen för ORDER BY i SQL språk.
ORDER BY är klausulen vi använder med "SELECT"-satsen i Hive-frågor för att sortera data. Den använder kolumner i Hive-tabeller för att sortera de specifika kolumnvärden som nämns med ORDER BY, och frågan visar resultaten i stigande eller fallande ordning efter dessa värden.
Om det nämnda ORDER BY-fältet är en sträng, visar det resultatet i lexikografisk ordning. I backend-systemet måste hela resultatmängden skickas vidare till en enda reducer.
Den enda reduceraren gör också ORDER BY dyr i en stor tabell, så i strikt läge (hive.mapred.mode=strict) Hive avvisar en ORDER BY som inte innehåller någon LIMIT-klausul.
Skärmdumpen nedan visar ORDER BY-frågan och dess sorterade rader.
Från skärmdumpen ovan kan vi observera följande:
- Det är frågan som utförs på tabellen "employees_guru" med ORDER BY-klausulen och Department som det definierade ORDER BY-kolumnnamnet. "Department" är en sträng, så den visar resultat baserat på lexikografisk ordning.
- Detta är den faktiska utdata för frågan. Resultaten visas baserat på avdelningskolumnen, till exempel ADMIN, Ekonomi och så vidare, i ordning.
Fråga:
SELECT * FROM employees_guru ORDER BY Department;
Gruppera efter fråga
GROUP BY-klausulen använder kolumner i Hive-tabeller för grouping de specifika kolumnvärdena som nämns med GROUP BY, och frågan väljer och visar resultaten grupperade efter dessa värden.
Till exempel visar skärmdumpen nedan det totala antalet anställda som finns på varje avdelning. Här har vi "Avdelning" som värdet GROUP BY.
Från skärmdumpen ovan kommer vi att observera följande:
- Det är frågan som utförs på tabellen "employees_guru" med GROUP BY-klausulen och Department som definierat GROUP BY-kolumnnamn.
- Utdata som visas här är avdelningsnamnet och antalet anställda i de olika avdelningarna. Alla anställda som tillhör en specifik avdelning grupperas och visas, så varje resultatrad är ett avdelningsnamn med dess totala antal anställda.
Fråga:
SELECT Department, count(*) FROM employees_guru GROUP BY Department;
Sortera efter
SORT BY-klausulen utför sortering på kolumnnamn i Hive-tabeller. Vi kan nämna DESC för sortering i fallande ordning och ASC för stigande sorteringsordning.
SORT BY sorterar raderna innan de matas in i reduceraren, så att ordningen garanteras inom varje reducerare snarare än över hela resultatet. Sorteringen beror alltid på kolumntypen.
Om till exempel kolumntypen är numerisk sorteras den i numerisk ordning, och om kolumntypen är sträng sorteras den i lexikografisk ordning.
Skärmdumpen nedan visar SORT BY-frågan med DESC.
Från ovanstående skärmdump kan vi observera följande:
- Det är frågan som utförs på tabellen "employees_guru" med SORT BY-klausulen och "Id" som det definierade SORT BY-kolumnnamnet. Vi använde nyckelordet DESC.
- Så visas utdata i fallande ordning "Id".
Fråga:
SELECT * from employees_guru SORT BY Id DESC;
Cluster By
CLUSTER BY används som ett alternativ för både DISTRIBUTE BY- och SORT BY-klausulerna i HiveQL.
CLUSTER BY-klausulen används på tabeller som finns i Hive. Hive använder kolumnerna i CLUSTER BY för att fördela raderna mellan reducerare, och CLUSTER BY-kolumner går till flera reducerare. Den säkerställer också sorteringsordningen för värdena som finns i dessa flera reducerare.
Till exempel nämns CLUSTER BY-klausulen i Id-kolumnnamnet i tabellen employees_guru. Att köra den här frågan ger resultat till flera reducerare i backend-systemet, men i frontend-systemet är det en alternativ klausul för både SORT BY och DISTRIBUTE BY.
Detta är backend-processen när vi utför en fråga med SORT BY, GROUP BY eller CLUSTER BY enligt MapReduce-ramverket. Så om vi vill lagra resultat i flera reducers använder vi CLUSTER BY.
CLUSTER BY-grammatiken accepterar endast kolumnnamn, så ASC och DESC kan inte kopplas till den; ett fallande resultat behöver DISTRIBUTE BY med en separat SORT BY … DESC.
Skärmdumpen nedan visar CLUSTER BY-frågan på Id.
Från ovanstående skärmdump får vi följande observationer:
- Det är frågan som utför CLUSTER BY-klausulen på Id-fältets värde. Här kommer den att hämta en sortering på Id-värdena.
- Den visar Id- och Namn-värdena som finns i employees_guru i sorterad ordning.
Fråga:
SELECT Id, Name from employees_guru CLUSTER BY Id;
Distribuera efter
DISTRIBUTE BY-klausulen används i tabeller som finns i Hive. Hive använder kolumnerna i DISTRIBUTE BY för att fördela raderna mellan reducerare, så att alla rader som delar samma DISTRIBUTE BY-kolumnvärde går till samma reducerare.
- Det säkerställer att var och en av N-reducerarna får en överlappningsfri konstruktionping uppsättning kolumnvärden
- Den sorterar inte utdata från varje reducerare, och matchande rader garanteras inte att ligga bredvid varandra.
Skärmdumpen nedan visar DISTRIBUTE BY-frågan på Id.
Från skärmdumpen ovan kan vi observera följande:
- DISTRIBUTE BY-klausulen utförs på Id:t för tabellen "employees_guru".
- Utdata visar Id och Namn. I serverdelen går rader med samma Id till samma reducer.
Fråga:
SELECT Id, Name from employees_guru DISTRIBUTE BY Id;
De fyra klausulerna är lätta att förväxla, så tabellen nedan jämför dem.
| Klausul | Reduktorer | Vad det garanterar |
|---|---|---|
| SORTERA EFTER | One | Total order för hela resultatet |
| SORTERA EFTER | Många | Beställning endast inom varje reducerare |
| DISTRIBUERA AV | Många | Samma nyckel når samma reducerare, osorterad |
| KLUSTERA EFTER | Många | FÖRDELA EFTER plus SORTERA EFTER, stigande |






