Taru päringute näited: järjestamine, rühmitamine ja Cluster By

⚡ Nutikas kokkuvõte

Hive'i päringud kasutavad ORDER BY, GROUP BY, SORT BY, CLUSTER BY ja DISTRIBUTE BY klausleid ridade sortimiseks, rühmitamiseks ja redutseerijate vahel jaotamiseks ning iga klauslit demonstreeritakse siin ühe töötajate näidistabeli abil.

  • 🧱 Esimene näidistabel: employees_guru luuakse kuue veeruga ja laaditakse failist Employees.txt enne mis tahes klausli käivitamist.
  • 🔢 JÄRJESTUS kokku: ORDER BY saadab kogu tulemuste komplekti ühele reduktorile, mis garanteerib täieliku järjestuse, kuid aeglustab suuri päringuid.
  • 🔤 Stringide sortimine: Stringiveerg, näiteks „Osakond”, tagastatakse leksikograafilises, mitte numbrilises järjekorras.
  • 📊 GROUP BY loendid: GROUP BY ja count(*) sidumine tagastab iga osakonna kohta ühe rea koos töötajate koguarvuga.
  • 🔀 SORTEERIMINE toimub reduktori järgi: SORT BY järjestab reduktorite sees olevaid ridu, seega mitu reduktorit annavad osaliselt järjestatud väljundi.
  • 🎯 CLUSTER BY ühendab: CLUSTER BY toimib samamoodi nagu DISTRIBUTE BY ja SORT BY, samas kui DISTRIBUTE BY üksi suunab vastavad võtmed ühele sortimata reduktorile.

Taru päringud Järjesta, Rühmita, Cluster Jagaja ja levitaja

Hive pakub lisaks ETL-i jaoks SQL-tüüpi päringukeelt hadoop failisüsteem.

Hive Query Language (HiveQL) pakub Hive'is SQL-tüüpi keskkonda tabelite, andmebaaside ja päringutega töötamiseks.

Hive'iga on seotud erinevat tüüpi klauslid erinevat tüüpi andmetega manipuleerimiseks ja päringute tegemiseks ning Hive pakub JDBC-ühenduvust paremate ühenduste loomiseks väljaspool keskkonda asuvate sõlmedega.

Hive'i päringud pakuvad järgmisi funktsioone:

  • Andmete modelleerimine, näiteks andmebaaside, tabelite jms loomine.
  • ETL-i funktsioonid, näiteks nttracandmete teisendamine, teisendamine ja tabelitesse laadimine
  • Liita erinevate andmetabelite liitmiseks
  • Kasutajapõhised kohandatud skriptid koodi hõlbustamiseks
  • Kiirem päringutööriist Hadoopi peal

Tabeli loomine tarus

Enne selle õpetuse põhiteema juurde asumist loome kõigepealt tabeli, mida kasutada järgnevate osade viitamiseks.

Selles õpetuses loome kuue veeruga tabeli „employees_guru”, nagu allolev ekraanipilt näitab.

Hive'i CREATE TABLE käsk employees_guru jaoks ja load käsk

Ülaltoodud ekraanipildist

  1. Loome tabeli „employees_guru” kuue veeruväärtusega, näiteks ID, nimi, vanus, aadress, palk, osakond, mis kuuluvad organisatsioonis „guru” tegutsevatele töötajatele.
  2. Selles etapis laadime andmeid tabelisse employees_guru. Laaditavad andmed paigutatakse faili Employees.txt.

Telli päringu järgi

HiveQL-i ORDER BY süntaks on sarnane ORDER BY süntaksiga SQL keel.

ORDER BY on lause, mida me kasutame koos „SELECT” lausega Taru päringud andmete sortimiseks. See kasutab Hive'i tabelite veerge ORDER BY abil mainitud konkreetsete veergude väärtuste sortimiseks ja päring kuvab tulemused nende väärtuste kasvavas või kahanevas järjekorras.

Kui mainitud ORDER BY väli on string, kuvab see tulemuse leksikograafilises järjekorras. Tagaosas tuleb kogu tulemuste komplekt edastada ühele reduktorile.

See üks reduktor muudab ka ORDER BY kalliks suurel tabelil, seega ranges režiimis (hive.mapred.mode=strict) Hive lükkab tagasi ORDER BY käsu, millel puudub LIMIT-klausel.

Allolev ekraanipilt näitab ORDER BY päringut ja selle sorteeritud ridu.

ORDER BY päring employees_guru lehel, sorteeritud osakonna järgi

Ülaltoodud ekraanipildilt näeme järgmist.

  1. See on päring, mis tehakse tabelile „employees_guru”, kus ORDER BY on klausel ja ORDER BY veerunimi on „Department”. „Department” on string, seega kuvab see tulemusi leksikograafilises järjekorras.
  2. See on päringu tegelik väljund. Tulemused kuvatakse osakonna veeru alusel, näiteks ADMIN, Finants jne, sellises järjekorras.

Päring:

SELECT * FROM employees_guru ORDER BY Department;

Rühmitage päringu järgi

GROUP BY klausel kasutab Hive'i tabelite veerge gruppide jaoksping GROUP BY abil mainitud konkreetsed veeruväärtused ning päring valib ja kuvab nende väärtuste järgi rühmitatud tulemused.

Näiteks allolev ekraanipilt näitab iga osakonna töötajate koguarvu. Siin on GROUP BY väärtuseks „Osakond”.

GROUP BY päring, mis loeb iga osakonna töötajaid

Ülaltoodud ekraanipildilt näeme järgmist:

  1. See on päring, mis teostatakse tabelis „employees_guru”, kasutades GROUP BY klauslit ja defineeritud GROUP BY veerunimeks Department.
  2. Siin kuvatav väljund on osakonna nimi ja töötajate arv erinevates osakondades. Kõik konkreetsesse osakonda kuuluvad töötajad on rühmitatud ja kuvatud, seega iga tulemuse rida on osakonna nimi koos töötajate koguarvuga.

Päring:

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

Sorteeri

SORT BY klausel sorteerib Hive'i tabelite veerunimesid väljundi sorteerimiseks. DESC-i saab kasutada kahanevas järjekorras sortimiseks ja ASC-i kasvavas järjekorras sortimiseks.

SORT BY sorteerib read enne nende reduktorisse edastamist, nii et järjestus on garanteeritud iga reduktori sees, mitte kogu tulemuse ulatuses. Sorteerimine sõltub alati veeru tüübist.

Näiteks kui veeru tüüp on numbriline, sorteeritakse see numbrilises järjekorras ja kui veeru tüüp on string, sorteeritakse see leksikograafilises järjekorras.

Allolev ekraanipilt näitab SORT BY päringut, kasutades DESC-i.

SORTEERI päringu employees_guru kohta, tagastades ID kahanevas järjekorras

Ülaltoodud ekraanipildist näeme järgmist:

  1. See on päring, mis teostatakse tabeli „employees_guru“ põhjal, kasutades SORT BY klauslit ja defineeritud SORT BY veeru nimeks „Id“. Me kasutasime märksõna DESC.
  2. Seega kuvatav väljund on kahanevas järjekorras "Id".

Päring:

SELECT * from employees_guru SORT BY Id DESC;

Cluster By

CLUSTER BY-d kasutatakse HiveQL-is alternatiivina nii DISTRIBUTE BY kui ka SORT BY klauslitele.

CLUSTER BY klauslit kasutatakse Hive'is olevate tabelite puhul. Hive kasutab CLUSTER BY veerge ridade jaotamiseks reduktorite vahel ning CLUSTER BY veerud lähevad mitmesse reduktorisse. See tagab ka nendes mitmes reduktoris olevate väärtuste sortimisjärjekorra.

Näiteks CLUSTER BY klausel on mainitud employees_guru tabeli Id veeru nimes. Selle päringu käivitamine annab tulemusi mitmele redutseerijale tagaserveris, kuid esiserveris on see alternatiivklausel nii SORT BY kui ka DISTRIBUTE BY jaoks.

See on taustprotsess, mida kasutatakse MapReduce'i raamistiku mõistes päringu teostamisel SORT BY, GROUP BY või CLUSTER BY abil. Seega, kui soovime tulemusi salvestada mitmesse reduktorisse, valime CLUSTER BY.

CLUSTER BY grammatika aktsepteerib ainult veerunimesid, seega ei saa sellele lisada ASC-d ja DESC-d; laskuva tulemuse saamiseks on vaja DISTRIBUTE BY-d koos eraldi SORT BY … DESC-ga.

Allolev ekraanipilt näitab CLUSTER BY päringut ID-l.

CLUSTER BY päring employees_guru Id veerul

Ülaltoodud ekraanipildist saame järgmised tähelepanekud:

  1. See on päring, mis täidab Id välja väärtusel CLUSTER BY klausli. Siin sorteeritakse Id väärtused.
  2. See kuvab employees_guru's olevad Id ja Name väärtused sorteeritud järjekorras.

Päring:

SELECT  Id, Name from employees_guru CLUSTER BY Id;

Levitab

DISTRIBUTE BY klauslit kasutatakse Hive'is olevate tabelite puhul. Hive kasutab DISTRIBUTE BY veerge ridade jaotamiseks reduktorite vahel, nii et kõik read, millel on sama DISTRIBUTE BY veeru väärtus, lähevad samasse reduktorisse.

  • See tagab, et iga N reduktorit saab kattuvuse puudumiseping veeru väärtuste komplekt
  • See ei sorteeri iga reduktori väljundit ja ei ole garanteeritud, et vastavad read asuvad üksteise kõrval.

Allolev ekraanipilt näitab ID-l põhinevat päringut DISTRIBUTE BY.

DISTRIBUTE BY päring employees_guru ID veerul

Ülaltoodud ekraanipildilt näeme järgmist.

  1. DISTRIBUTE BY klausel täidetakse tabeli „employees_guru” ID-l.
  2. Väljund näitab ID-d ja nime. Tagaosas lähevad sama ID-ga read samasse reduktorisse.

Päring:

SELECT  Id, Name from employees_guru DISTRIBUTE BY Id;

Neid nelja klauslit on lihtne segi ajada, seega on allolev tabel neid võrdlenud.

Klausel Reduktorid Mida see garanteerib
TELLI Üks Kogu tulemuse tellimus
SORTEERIMA Palju Tellimine ainult iga reduktori sees
LEVITAB Palju Sama võti jõuab sama reduktorini, sortimata kujul
KLASTRI JÄRGI Palju JAOTA pluss SORTI JÄRGI, kasvavalt

KKK

Üks reduktor peab sorteerima iga rea, mis võib suurel tabelil tundide kaupa töötada. PIIRA piire, mis toimivad. Hive.mapred.mode määramine väärtusele nonstrict eemaldab piirangu täielikult.

Määrake `mapreduce.job.reduces` enne päringut, et loendur parandada, vastasel juhul hindab Hive seda sisendi suuruse põhjal. `ORDER BY` ignoreerib seda sätet, sest kogu järjestus koondub alati ühele reduktorile.

Ei. See klausel aktsepteerib ainult veerunimesid ja sorteerib alati kasvavalt. Kirjutage partitsiooniveerule DISTRIBUTE BY, kasutades eraldi SORT BY veergu DESC; need kaks veergu võivad samuti erineda.

Nad on omavahel seotud, aga mitte identsed. Koppade võtmine salvestab ridu jäädavalt kindlasse arvu failidesse, samas kui CLUSTER BY jaotab ja sorteerib ridu ainult ühe päringu ajaks.

Masinõppe assistendid loevad EXPLAIN-plaani ja märgistavad ära põhjused, näiteks piiramatu ORDER BY, puuduva partitsioonifiltri või moonutatud võtme. Kinnitage iga soovitus tegeliku käituskeskkonna suhtes.

See joonistab need mustrid lühikese kommentaari põhjal hästi välja. Kontrollige kõike mootorispetsiifilist, sest see seguneb kergesti. Spark SQL-i või Presto süntaks, mille Hive tagasi lükkab, näiteks DESC pärast CLUSTER BY-d.

Kuue veeru väärtusi sisaldab lihttekstifail nimega Employees.txt, mis laaditakse tabelisse enne esimese päringu käivitamist. Kõik eraldajatega failid, millel on vastavad veerud, toimivad samamoodi.

Semantika on identne, kuna need on HiveQL-i keele, mitte mootori funktsioonid. Muutub ainult füüsiline plaan – mootorid ajastavad sortimise ja segamise etappe erinevalt, seega käitusajad varieeruvad, tulemused aga mitte.

Võta see postitus kokku järgmiselt: