Příklady dotazů Hive: Řazení podle, Seskupení podle a Cluster By

⚡ Chytré shrnutí

Dotazy Hive používají klauzule ORDER BY, GROUP BY, SORT BY, CLUSTER BY a DISTRIBUTE BY k řazení, seskupování a rozprostření řádků mezi reduktory a každá klauzule je zde demonstrována na jedné ukázkové tabulce zaměstnanců.

  • 🧱 Ukázková tabulka jako první: Soubor employees_guru se vytvoří se šesti sloupci a načte se ze souboru Employees.txt před spuštěním jakékoli klauzule.
  • 🔢 ŘAZENÍ PODLE součtů: ORDER BY odešle celou sadu výsledků jednomu reduktoru, což zaručuje úplné pořadí, ale zpomaluje rozsáhlé dotazy.
  • 🔤 Řazení řetězců: Řetězcový sloupec, jako například Department, je vrácen v lexikografickém pořadí, nikoli v číselném pořadí.
  • 📊 Počet GROUP BY: Spárování GROUP BY s count(*) vrátí jeden řádek pro každé oddělení s celkovým počtem zaměstnanců.
  • 🔀 ŘAZENÍ PODLE je podle reduktoru: SORT BY seřadí řádky uvnitř každého reduktoru, takže více reduktorů produkuje částečně uspořádaný výstup.
  • 🎯 CLUSTER BY kombinuje: CLUSTER BY funguje jako DISTRIBUTE BY plus SORT BY, zatímco DISTRIBUTE BY sám směruje odpovídající klíče k jednomu reduktoru bez třídění.

Dotazy Hive Řadit podle, Seskupit podle, Cluster Od a distribuováno

Hive poskytuje dotazovací jazyk typu SQL pro účely ETL nad rámec Hadoop souborový systém.

Hive Query Language (HiveQL) poskytuje v Hive prostředí typu SQL pro práci s tabulkami, databázemi a dotazy.

S Hive jsou spojeny různé typy klauzulí pro provádění různých typů manipulace s daty a dotazování a Hive poskytuje konektivitu JDBC pro lepší spojení s uzly mimo prostředí.

Dotazy Hive poskytují následující funkce:

  • Modelování dat, jako je tvorba databází, tabulek atd.
  • ETL funkce, jako například extracování, transformace a načítání dat do tabulek
  • Připojuje ke sloučení různých datových tabulek
  • Uživatelsky specifické uživatelské skripty pro usnadnění kódu
  • Rychlejší dotazovací nástroj nad Hadoopem

Vytvoření tabulky v Hive

Než začneme s hlavním tématem tohoto tutoriálu, nejprve si vytvoříme tabulku, kterou budeme používat jako referenci pro následující části.

V tomto tutoriálu vytvoříme tabulku „employees_guru“ se 6 sloupci, jak ukazuje snímek obrazovky níže.

Příkaz CREATE TABLE v Hive pro employees_guru a příkaz load

Z výše uvedeného snímku obrazovky

  1. Vytváříme tabulku „employees_guru“ se 6 hodnotami ve sloupcích, jako jsou ID, Jméno, Věk, Adresa, Plat, Oddělení, které patří zaměstnancům přítomným v organizaci „guru“.
  2. V tomto kroku načítáme data do tabulky employees_guru. Data, která budeme načítat, jsou umístěna v souboru Employees.txt.

Objednávejte podle dotazu

Syntaxe ORDER BY v HiveQL je podobná syntaxi ORDER BY v SQL Jazyk.

ORDER BY je klauzule, kterou používáme s příkazem „SELECT“ v Dotazy na úl k řazení dat. Používá sloupce v tabulkách Hive k řazení konkrétních hodnot sloupců uvedených pomocí ORDER BY a dotaz zobrazuje výsledky ve vzestupném nebo sestupném pořadí podle těchto hodnot.

Pokud je zmíněné pole ORDER BY řetězec, zobrazí se výsledek v lexikografickém pořadí. Na backendu musí být celá sada výsledků předána jedinému reduktoru.

Tento jediný reduktor také ztěžuje použití ORDER BY na velké tabulce, takže v striktním režimu (hive.mapred.mode=strict) Hive odmítá ORDER BY, který neobsahuje klauzuli LIMIT.

Níže uvedený snímek obrazovky ukazuje dotaz ORDER BY a jeho seřazené řádky.

Dotaz ORDER BY na employees_guru seřazený podle oddělení

Z výše uvedeného snímku obrazovky můžeme pozorovat následující:

  1. Jedná se o dotaz provedený na tabulce „employees_guru“ s klauzulí ORDER BY a sloupcem Department jako definovaným názvem ORDER BY. „Department“ je řetězec, takže zobrazuje výsledky na základě lexikografického pořadí.
  2. Toto je skutečný výstup dotazu. Výsledky se zobrazují v pořadí podle sloupce Oddělení, například ADMIN, Finance atd.

Dotaz:

SELECT * FROM employees_guru ORDER BY Department;

Seskupit podle dotazu

Klauzule GROUP BY používá sloupce v tabulkách Hive pro seskupování.ping konkrétní hodnoty sloupců uvedené pomocí příkazu GROUP BY a dotaz vybere a zobrazí výsledky seskupené podle těchto hodnot.

Například níže uvedený snímek obrazovky zobrazuje celkový počet zaměstnanců přítomných v každém oddělení. Zde máme jako hodnotu GROUP BY nastavenou na „Department“.

Dotaz GROUP BY počítání zaměstnanců v každém oddělení

Z výše uvedeného snímku obrazovky si všimneme následujícího:

  1. Je to dotaz, který se provádí na tabulce „employees_guru“ s klauzulí GROUP BY a sloupcem GROUP BY s názvem Oddělení.
  2. Zde zobrazený výstup je název oddělení a počet zaměstnanců v jednotlivých odděleních. Všichni zaměstnanci patřící do konkrétního oddělení jsou seskupeni a zobrazeni, takže každý řádek výsledku je název oddělení s celkovým počtem zaměstnanců.

Dotaz:

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

Seřadit podle

Klauzule SORT BY seřadí výstup s názvy sloupců tabulek Hive. Můžeme zmínit DESC pro sestupné řazení a ASC pro vzestupné řazení.

SORT BY seřadí řádky před jejich předáním reduktoru, takže je zaručeno pořadí uvnitř každého reduktoru, nikoli v celém výsledku. Řazení vždy závisí na typu sloupce.

Například pokud je typ sloupce číselný, seřadí se v číselném pořadí, a pokud je typ sloupce řetězec, seřadí se v lexikografickém pořadí.

Níže uvedený snímek obrazovky ukazuje dotaz SORT BY s použitím DESC.

Dotaz SORT BY na employees_guru vrací ID v sestupném pořadí

Z výše uvedeného snímku obrazovky můžeme pozorovat následující:

  1. Jedná se o dotaz provedený na tabulce „employees_guru“ s klauzulí SORT BY a „Id“ jako definovaným názvem sloupce SORT BY. Použili jsme klíčové slovo DESC.
  2. Zobrazený výstup je tedy v sestupném pořadí podle „Id“.

Dotaz:

SELECT * from employees_guru SORT BY Id DESC;

Cluster By

Klauzule CLUSTER BY se v HiveQL používá jako alternativa pro klauzule DISTRIBUTE BY a SORT BY.

Klauzule CLUSTER BY se používá u tabulek přítomných v Hive. Hive používá sloupce v klauzuli CLUSTER BY k rozdělení řádků mezi reduktory a sloupce CLUSTER BY jdou do více reduktorů. Také zajišťuje pořadí řazení hodnot přítomných v těchto více reduktorech.

Například klauzule CLUSTER BY je uvedena v názvu sloupce Id tabulky employees_guru. Spuštění tohoto dotazu vrátí výsledky více reduktorům na backendu, ale na frontendu je to alternativní klauzule pro SORT BY i DISTRIBUTE BY.

Toto je proces na straně serveru, když provádíme dotaz s funkcemi SORT BY, GROUP BY nebo CLUSTER BY v rámci frameworku MapReduce. Pokud tedy chceme výsledky ukládat do více reduktorů, použijeme CLUSTER BY.

Gramatika CLUSTER BY akceptuje pouze názvy sloupců, takže k ní nelze připojit ASC a DESC; sestupný výsledek vyžaduje DISTRIBUTE BY se samostatným SORT BY … DESC.

Níže uvedený snímek obrazovky ukazuje dotaz CLUSTER BY na ID.

Dotaz CLUSTER BY na sloupec Id v employees_guru

Z výše uvedeného snímku obrazovky získáváme následující postřehy:

  1. Je to dotaz, který provádí klauzuli CLUSTER BY na hodnotě pole Id. Zde se seřadí hodnoty Id.
  2. Zobrazuje hodnoty Id a Name přítomné v employees_guru v seřazeném pořadí.

Dotaz:

SELECT  Id, Name from employees_guru CLUSTER BY Id;

Distribuovat podle

Klauzule DISTRIBUTE BY se používá u tabulek v Hive. Hive používá sloupce v klauzuli DISTRIBUTE BY k rozdělení řádků mezi reduktory, takže všechny řádky, které sdílejí stejnou hodnotu sloupce DISTRIBUTE BY, jdou do stejného reduktoru.

  • Zajišťuje, že každý z N reduktorů obdrží nepřekrývající seping sada hodnot sloupce
  • Neseřadí výstup každého reduktoru a není zaručeno, že odpovídající řádky budou sedět vedle sebe.

Níže uvedený snímek obrazovky ukazuje dotaz DISTRIBUTE BY na ID.

Dotaz DISTRIBUTE BY na sloupec Id v employees_guru

Z výše uvedeného snímku obrazovky můžeme pozorovat následující:

  1. Klauzule DISTRIBUTE BY se provádí na ID tabulky „employees_guru“.
  2. Výstup zobrazuje ID a název. Na backendu se řádky se stejným ID odesílají do stejného reduktoru.

Dotaz:

SELECT  Id, Name from employees_guru DISTRIBUTE BY Id;

Tyto čtyři věty se snadno zaměňují, proto je porovnává tabulka níže.

Doložka Reduktory Co to zaručuje
SEŘADIT PODLE Jedna Celkové pořadí v celém výsledku
SEŘAZENO PODLE Mnoho Objednávání pouze v rámci každého reduktoru
DISTRIBUOVAT PODLE Mnoho Stejný klíč dosahuje stejného reduktoru, netříděný
SKLUPOVAT PODLE Mnoho DISTRIBUOVAT BY plus ŘAZENÍ BY vzestupně

Nejčastější dotazy

Jeden reduktor musí třídit každý řádek, což může na velké tabulce běžet hodiny. LIMIT hranice, které fungují. Nastavením hive.mapred.mode na nonstrict toto omezení zcela odstraníte.

Nastavením parametru mapreduce.job.reduces před dotaz se opraví počet, jinak Hive odhadne počet z velikosti vstupu. ORDER BY toto nastavení ignoruje, protože celková objednávka se vždy sbalí do jednoho reduktoru.

Ne. Klauzule akceptuje pouze názvy sloupců a vždy seřazuje vzestupně. Namísto toho napište DISTRIBUTE BY do sloupce oddílu se samostatným sloupcem SORT BY DESC; tyto dva sloupce se také mohou lišit.

Jsou příbuzní, ale ne identičtí. Nakládání Funkce CLUSTER BY trvale ukládá řádky do pevného počtu souborů, zatímco funkce CLUSTER BY distribuuje a třídí řádky pouze po dobu trvání jednoho dotazu.

Asistenti strojového učení čtou plán EXPLAIN a označují příčiny, jako je neohraničený ORDER BY, chybějící filtr oddílů nebo zkosený klíč. Každý návrh ověřte oproti skutečnému běhovému prostředí.

Tyto vzorce dobře navrhuje z krátkého komentáře. Ověřte cokoli specifického pro engine, protože se to snadno zapojí. Spark Syntaxe SQL nebo Presto, kterou Hive odmítá, například DESC po CLUSTER BY.

Soubor s názvem Employees.txt ve formátu prostého textu obsahuje hodnoty šesti sloupců a je načten do tabulky před spuštěním prvního dotazu. Jakýkoli soubor s oddělovači a odpovídajícími sloupci funguje stejným způsobem.

Sémantika je identická, protože se jedná o funkce jazyka HiveQL, nikoli o funkce enginu. Mění se pouze fyzický plán – enginy plánují fáze řazení a náhodného přehrávání odlišně, takže se běhové doby liší, zatímco výsledky ne.

Shrňte tento příspěvek takto: