Eksempler på Hive-forespørgsler: Sortér efter, Gruppér efter & Cluster By

⚡ Smart opsummering

Hive-forespørgsler bruger ORDER BY-, GROUP BY-, SORT BY-, CLUSTER BY- og DISTRIBUTE BY-klausuler til at sortere, gruppere og sprede rækker på tværs af reduceringsfunktioner, og hver klausul demonstreres her i en enkelt eksempeltabel med medarbejdere.

  • 🧱 Eksempeltabel først: employees_guru oprettes med seks kolonner og indlæses fra Employees.txt, før en klausul køres.
  • 🔢 SORTER EFTER totaler: ORDER BY sender hele resultatsættet til én reducer, hvilket garanterer total rækkefølge, men forsinker store forespørgsler.
  • 🔤 Stringsortering: En strengkolonne som f.eks. Afdeling returneres i leksikografisk rækkefølge i stedet for numerisk rækkefølge.
  • 📊 GROUP BY-tællinger: Parring af GROUP BY med count(*) returnerer én række pr. afdeling med dens medarbejdertotal.
  • 🔀 SORTÉR EFTER er pr. reducer: SORT BY ordner rækker i hver reducer, så flere reducerer producerer delvist ordnet output.
  • 🎯 CLUSTER BY kombinerer: CLUSTER BY fungerer som DISTRIBUTE BY plus SORT BY, mens DISTRIBUTE BY alene ruter matchende nøgler til én reducer usorteret.

Hive-forespørgsler Sortér efter, Gruppér efter, Cluster Af og distribuer af

Hive leverer et SQL-lignende forespørgselssprog til ETL-formål oven i Hadoop filsystem.

Hive Query Language (HiveQL) leverer et SQL-lignende miljø i Hive til arbejde med tabeller, databaser og forespørgsler.

Forskellige typer klausuler er knyttet til Hive for at udføre forskellige typer datamanipulation og forespørgsler, og Hive leverer JDBC-forbindelse for bedre forbindelser med noder uden for miljøet.

Hive-forespørgsler tilbyder følgende funktioner:

  • Datamodellering såsom oprettelse af databaser, tabeller osv.
  • ETL-funktionaliteter såsom f.eks.traction, transformation og indlæsning af data i tabeller
  • Sammenføjninger at flette forskellige datatabeller
  • Brugerspecifikke brugerdefinerede scripts for nem kode
  • Hurtigere forespørgselsværktøj oven på Hadoop

Oprettelse af bord i Hive

Før vi går i gang med hovedemnet i denne vejledning, vil vi først oprette en tabel, der skal bruges som reference i de følgende afsnit.

I denne vejledning skal vi oprette tabellen "employees_guru" med 6 kolonner, som skærmbilledet nedenfor viser.

Hive CREATE TABLE-sætning for employees_guru og load-kommandoen

Fra ovenstående skærmbillede,

  1. Vi opretter tabellen "employees_guru" med 6 kolonneværdier såsom Id, Navn, Alder, Adresse, Løn og Afdeling, som tilhører de medarbejdere, der er til stede i organisationen "guru".
  2. I dette trin indlæser vi data i tabellen employees_guru. De data, vi skal indlæse, placeres i filen Employees.txt.

Bestil efter forespørgsel

ORDER BY-syntaksen i HiveQL ligner syntaksen for ORDER BY i SQL Sprog.

ORDER BY er den klausul, vi bruger med "SELECT"-sætningen i Hive-forespørgsler til at sortere data. Den bruger kolonner i Hive-tabeller til at sortere de specifikke kolonneværdier, der er nævnt med ORDER BY, og forespørgslen viser resultaterne i stigende eller faldende rækkefølge af disse værdier.

Hvis det nævnte ORDER BY-felt er en streng, viser det resultatet i leksikografisk rækkefølge. I backend-systemet skal hele resultatsættet sendes videre til en enkelt reducer.

Den enkelte reducer gør også ORDER BY dyr på en stor tabel, så i streng tilstand (hive.mapred.mode=strict) Hive afviser en ORDER BY, der ikke indeholder en LIMIT-klausul.

Skærmbilledet nedenfor viser ORDER BY-forespørgslen og dens sorterede rækker.

ORDER BY-forespørgsel på employees_guru sorteret efter afdeling

Ud fra ovenstående skærmbillede kan vi observere følgende:

  1. Det er forespørgslen, der udføres på tabellen "employees_guru" med ORDER BY-klausulen og Department som det definerede ORDER BY-kolonnenavn. "Department" er en streng, så den viser resultater baseret på leksikografisk rækkefølge.
  2. Dette er det faktiske output for forespørgslen. Resultaterne vises baseret på Afdeling-kolonnen, f.eks. ADMIN, Finans osv., i rækkefølge.

Forespørgsel:

SELECT * FROM employees_guru ORDER BY Department;

Gruppér efter forespørgsel

GROUP BY-klausulen bruger kolonner på Hive-tabeller til grouping de bestemte kolonneværdier, der er nævnt med GROUP BY, og forespørgslen vælger og viser resultaterne grupperet efter disse værdier.

For eksempel viser skærmbilledet nedenfor det samlede antal medarbejdere i hver afdeling. Her har vi "Afdeling" som værdien GROUP BY.

GROUP BY-forespørgsel, der tæller medarbejdere i hver afdeling

Ud fra ovenstående skærmbillede vil vi observere følgende:

  1. Det er den forespørgsel, der udføres på tabellen "employees_guru" med GROUP BY-klausulen og Department som det definerede GROUP BY-kolonnenavn.
  2. Outputtet, der vises her, er afdelingsnavnet og antallet af medarbejdere i de forskellige afdelinger. Alle medarbejdere, der tilhører en bestemt afdeling, grupperes og vises, så hver resultatrække er et afdelingsnavn med det samlede antal medarbejdere.

Forespørgsel:

SELECT Department, count(*) FROM employees_guru GROUP BY Department;

Sorter efter

SORT BY-klausulen udfører sortering på kolonnenavne i Hive-tabeller. Vi kan nævne DESC for sortering i faldende rækkefølge og ASC for stigende rækkefølge.

SORT BY sorterer rækkerne, før de føres til reduceren, så rækkefølgen er garanteret inden for hver reducer snarere end på tværs af hele resultatet. Sorteringen afhænger altid af kolonnetypen.

For eksempel, hvis kolonnetypen er numerisk, sorteres den i numerisk rækkefølge, og hvis kolonnetypen er streng, sorteres den i leksikografisk rækkefølge.

Skærmbilledet nedenfor viser SORT BY-forespørgslen ved hjælp af DESC.

SORTÉR EFTER forespørgsel på employees_guru, der returnerer Id i faldende rækkefølge

Fra ovenstående skærmbillede kan vi observere følgende:

  1. Det er forespørgslen, der udføres på tabellen "employees_guru" med SORT BY-klausulen og "Id" som det definerede SORT BY-kolonnenavn. Vi brugte nøgleordet DESC.
  2. Så det viste output er i faldende rækkefølge efter "Id".

Forespørgsel:

SELECT * from employees_guru SORT BY Id DESC;

Cluster By

CLUSTER BY bruges som et alternativ til både DISTRIBUTE BY- og SORT BY-klausulerne i HiveQL.

CLUSTER BY-klausulen bruges på tabeller, der findes i Hive. Hive bruger kolonnerne i CLUSTER BY til at fordele rækkerne mellem reduceringsværktøjer, og CLUSTER BY-kolonner går til flere reduceringsværktøjer. Den sikrer også sorteringsrækkefølgen for de værdier, der findes i disse flere reduceringsværktøjer.

For eksempel er CLUSTER BY-klausulen nævnt i Id-kolonnens navn i employees_guru-tabellen. Udførelse af denne forespørgsel giver resultater til flere reduceringsværktøjer i backend, men i frontend er det en alternativ klausul for både SORT BY og DISTRIBUTE BY.

Dette er backend-processen, når vi udfører en forespørgsel med SORT BY, GROUP BY eller CLUSTER BY i henhold til MapReduce-frameworket. Så hvis vi vil gemme resultater i flere reducere, bruger vi CLUSTER BY.

CLUSTER BY-grammatikken accepterer kun kolonnenavne, så ASC og DESC kan ikke tilknyttes den; et faldende resultat kræver DISTRIBUTE BY med en separat SORT BY … DESC.

Skærmbilledet nedenfor viser CLUSTER BY-forespørgslen på Id.

CLUSTER BY-forespørgsel på Id-kolonnen i employees_guru

Fra ovenstående skærmbillede får vi følgende observationer:

  1. Det er forespørgslen, der udfører CLUSTER BY-klausulen på Id-feltværdien. Her vil den få en sortering på Id-værdierne.
  2. Den viser Id- og Name-værdierne i employees_guru i sorteret rækkefølge.

Forespørgsel:

SELECT  Id, Name from employees_guru CLUSTER BY Id;

Distribuer efter

DISTRIBUTE BY-klausulen bruges på tabeller, der findes i Hive. Hive bruger kolonnerne i DISTRIBUTE BY til at fordele rækkerne mellem reduceringsværktøjer, så alle rækker, der deler den samme DISTRIBUTE BY-kolonneværdi, går til den samme reduceringsværktøj.

  • Det sikrer, at hver af N-reduktionsenhederne får en ikke-overlapningping sæt af kolonneværdier
  • Den sorterer ikke outputtet fra hver reducer, og matchende rækker garanteres ikke at sidde ved siden af ​​hinanden

Skærmbilledet nedenfor viser DISTRIBUTE BY-forespørgslen på Id.

DISTRIBUTE BY-forespørgsel på Id-kolonnen i employees_guru

Fra ovenstående skærmbillede kan vi observere følgende:

  1. DISTRIBUTE BY-klausulen udføres på Id'et for tabellen "employees_guru".
  2. Outputtet viser Id og Navn. I backend går rækker med samme Id til den samme reducer.

Forespørgsel:

SELECT  Id, Name from employees_guru DISTRIBUTE BY Id;

De fire klausuler er lette at forveksle, så tabellen nedenfor sammenligner dem.

Klausul Nedfotograferingsudstyr Hvad det garanterer
BESTIL BY Én Samlet ordre på tværs af hele resultatet
SORTER EFTER Mange Bestilling kun inden for hver reduktionsgearkasse
DISTRIBUER EFTER Mange Samme nøgle når den samme reducer, usorteret
KLYNGER EFTER Mange DISTRIBUTE EFTER plus SORT EFTER, stigende

Ofte Stillede Spørgsmål

En enkelt reducer skal sortere hver række, hvilket kan køre i timevis på en stor tabel. LIMIT grænser, der virker. Hvis hive.mapred.mode indstilles til nonstrict, fjernes begrænsningen helt.

Sæt mapreduce.job.reduces før forespørgslen for at fastsætte antallet, ellers estimerer Hive det ud fra inputstørrelsen. ORDER BY ignorerer indstillingen, fordi en samlet ordre altid kollapser på én reducer.

Nej. Klausulen accepterer kun kolonnenavne og sorterer altid stigende. Skriv DISTRIBUTE BY på partitionskolonnen med en separat SORT BY-kolonne DESC i stedet; de to kolonner kan også være forskellige.

De er beslægtede, men ikke identiske. Inddeling gemmer rækker permanent i et fast antal filer, mens CLUSTER BY kun distribuerer og sorterer rækker i løbet af én forespørgsel.

Maskinlæringsassistenter læser EXPLAIN-planen og markerer årsager såsom en ubegrænset ORDER BY, et manglende partitionsfilter eller en skæv nøgle. Bekræft alle forslag i forhold til den faktiske kørselstid.

Den udarbejder disse mønstre godt fra en kort kommentar. Bekræft alt, der er specifikt for motoren, fordi det nemt blandes ind. Spark SQL- eller Presto-syntaks, som Hive afviser, f.eks. DESC efter CLUSTER BY.

En almindelig tekstfil med navnet Employees.txt indeholder de seks kolonneværdier og indlæses i tabellen, før den første forespørgsel køres. Enhver afgrænset fil med matchende kolonner fungerer på samme måde.

Semantikken er identisk, fordi det er HiveQL-sprogfunktioner snarere end motorfunktioner. Kun den fysiske plan ændres – motorerne planlægger sortering og blander faser forskelligt, så runtime varierer, mens resultaterne ikke gør.

Opsummer dette indlæg med: