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.

  • 🧱 Exempeltabell först: employees_guru skapas med sex kolumner och laddas från Employees.txt innan någon klausul körs.
  • 🔢 SORTERA EFTER totalsummor: ORDER BY skickar hela resultatmängden till en reducer, vilket garanterar total ordning men saktar ner stora frågor.
  • 🔤 Strängsortering: En strängkolumn som Avdelning returneras i lexikografisk ordning snarare än numerisk ordning.
  • 📊 GROUP BY-räkningar: Att para ihop GROUP BY med count(*) returnerar en rad per avdelning med dess anställdtotal.
  • 🔀 SORTERA EFTER är per reducerare: SORT BY ordnar rader inuti varje reducerare, så flera reducerare producerar delvis ordnad utdata.
  • 🎯 CLUSTER BY kombinerar: CLUSTER BY fungerar som DISTRIBUTE BY plus SORT BY, medan DISTRIBUTE BY ensamt dirigerar matchande nycklar till en reducerare osorterad.

Hive-frågor Sortera efter, Gruppera efter, Cluster Av och distribuera av

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.

Hive CREATE TABLE-uttryck för employees_guru och load-kommandot

Från ovanstående skärmdump,

  1. 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”.
  2. 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.

ORDER BY-fråga på employees_guru sorterad efter avdelning

Från skärmdumpen ovan kan vi observera följande:

  1. 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.
  2. 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.

GROUP BY-fråga som räknar anställda i varje avdelning

Från skärmdumpen ovan kommer vi att observera följande:

  1. Det är frågan som utförs på tabellen "employees_guru" med GROUP BY-klausulen och Department som definierat GROUP BY-kolumnnamn.
  2. 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.

SORTERA EFTER fråga på employees_guru som returnerar Id i fallande ordning

Från ovanstående skärmdump kan vi observera följande:

  1. 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.
  2. 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.

CLUSTER BY-fråga på Id-kolumnen i employees_guru

Från ovanstående skärmdump får vi följande observationer:

  1. 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.
  2. 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.

DISTRIBUTE BY-fråga på Id-kolumnen i employees_guru

Från skärmdumpen ovan kan vi observera följande:

  1. DISTRIBUTE BY-klausulen utförs på Id:t för tabellen "employees_guru".
  2. 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

Vanliga frågor

En enda reducer måste sortera varje rad, vilket kan köras i timmar i en stor tabell. LIMIT-gränser som fungerar. Att sätta hive.mapred.mode till nonstrict tar bort begränsningen helt.

Ställ in mapreduce.job.reduces före frågan för att fixa antalet, annars uppskattar Hive det från inmatningsstorleken. ORDER BY ignorerar inställningen, eftersom en total ordning alltid kollapsar på en reducer.

Nej. Klausulen accepterar endast kolumnnamn och sorterar alltid stigande. Skriv DISTRIBUTE BY på partitionskolumnen med en separat SORT BY-kolumn DESC istället; de två kolumnerna kan också skilja sig åt.

De är släkt men inte identiska. Bucketing lagrar rader permanent i ett fast antal filer, medan CLUSTER BY endast distribuerar och sorterar rader under hela en fråga.

Maskininlärningsassistenter läser EXPLAIN-planen och flaggar orsaker som en obegränsad ORDER BY, ett saknat partitionsfilter eller en sned nyckel. Bekräfta alla förslag mot den faktiska körtiden.

Den utarbetar dessa mönster bra från en kort kommentar. Verifiera allt motorspecifikt, eftersom det enkelt blandas in Spark SQL- eller Presto-syntax som Hive avvisar, till exempel DESC efter CLUSTER BY.

En vanlig textfil med namnet Employees.txt innehåller de sex kolumnvärdena och laddas in i tabellen innan den första frågan körs. Alla avgränsade filer med matchande kolumner fungerar på samma sätt.

Semantiken är identisk, eftersom de är HiveQL-språkfunktioner snarare än motorfunktioner. Endast den fysiska planen ändras – motorerna schemalägger sortering och blandning av steg på olika sätt, så körtiderna varierar medan resultaten inte gör det.

Sammanfatta detta inlägg med: