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ů.

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.
Z výše uvedeného snímku obrazovky
- 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“.
- 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.
Z výše uvedeného snímku obrazovky můžeme pozorovat následující:
- 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í.
- 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“.
Z výše uvedeného snímku obrazovky si všimneme následujícího:
- Je to dotaz, který se provádí na tabulce „employees_guru“ s klauzulí GROUP BY a sloupcem GROUP BY s názvem Oddělení.
- 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.
Z výše uvedeného snímku obrazovky můžeme pozorovat následující:
- 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.
- 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.
Z výše uvedeného snímku obrazovky získáváme následující postřehy:
- Je to dotaz, který provádí klauzuli CLUSTER BY na hodnotě pole Id. Zde se seřadí hodnoty Id.
- 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.
Z výše uvedeného snímku obrazovky můžeme pozorovat následující:
- Klauzule DISTRIBUTE BY se provádí na ID tabulky „employees_guru“.
- 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ě |






