Hiveクエリの例: Order By、Group By & Cluster By
⚡ スマートサマリー
Hiveクエリでは、ORDER BY、GROUP BY、SORT BY、CLUSTER BY、DISTRIBUTE BY句を使用して、行をリデューサー間でソート、グループ化、分散します。ここでは、各句を単一のサンプルemployeesテーブルで説明します。

HiveはETL目的のためにSQLタイプのクエリ言語を提供します。 Hadoopの ファイルシステム。
Hiveクエリ言語(HiveQL)は、Hive内でテーブル、データベース、クエリを操作するためのSQLタイプの環境を提供します。
Hiveには、さまざまな種類のデータ操作やクエリを実行するためのさまざまな種類の句が関連付けられており、Hiveは環境外のノードとの接続を向上させるためにJDBC接続機能を提供します。
Hiveクエリは以下の機能を提供します。
- データベースやテーブルなどの作成といったデータモデリング。
- ETL機能の例tracデータの変換、テーブルへのロード
- ジョイン 異なるデータテーブルをマージするには
- コードを容易にするユーザー固有のカスタム スクリプト
- Hadoop 上の高速クエリ ツール
Hive でのテーブルの作成
このチュートリアルのメインテーマに入る前に、まず以降の各セクションで参照するための表を作成します。
このチュートリアルでは、以下のスクリーンショットに示すように、6つの列を持つ「employees_guru」というテーブルを作成します。
上のスクリーンショットから、
- 私たちは、「guru」という組織に所属する従業員に関する、ID、名前、年齢、住所、給与、部署の6つの列の値を持つテーブル「employees_guru」を作成します。
- このステップでは、employees_guruテーブルにデータをロードします。ロードするデータは、Employees.txtファイルに格納されています。
クエリによる注文
HiveQL の ORDER BY 構文は、 SQL 言語。
ORDER BY は「SELECT」ステートメントで使用する句です。 ハイブクエリ データをソートします。Hiveテーブルの列を使用して、ORDER BYで指定された特定の列の値をソートし、クエリはそれらの値の昇順または降順で結果を表示します。
指定された ORDER BY フィールドが文字列の場合、結果は辞書順に表示されます。バックエンドでは、結果セット全体を単一のリデューサーに渡す必要があります。
その単一のリデューサーは、大きなテーブルでの ORDER BY をコストのかかるものにするため、厳密モードでは (hive.mapred.mode=strict) Hive は LIMIT 句を含まない ORDER BY を拒否します。
以下のスクリーンショットは、ORDER BYクエリとそのソートされた行を示しています。
上記のスクリーンショットから、以下のことが確認できます。
- これは、「employees_guru」テーブルに対してORDER BY句と、定義されたORDER BY列名としてDepartmentを指定して実行されたクエリです。「Department」は文字列であるため、結果は辞書順に表示されます。
- これはクエリの実際の出力です。結果は「部門」列に基づいて、管理部門、財務部門など、順番に表示されます。
クエリ:
SELECT * FROM employees_guru ORDER BY Department;
クエリごとにグループ化する
GROUP BY句は、Hiveテーブルの列をグループ化に使用します。ping GROUP BY句で指定された特定の列の値に基づいてクエリが実行され、それらの値でグループ化された結果が選択されて表示されます。
例えば、以下のスクリーンショットは、各部署に所属する従業員の総数を示しています。ここでは、「部署」をグループ化の値として使用しています。
上記のスクリーンショットから、以下の点が確認できます。
- これは、「employees_guru」テーブルに対して、GROUP BY句と、定義されたGROUP BY列名としてDepartmentを指定して実行されるクエリです。
- ここに表示されている出力は、各部署の部署名と従業員数です。特定の部署に所属するすべての従業員がグループ化されて表示されるため、各結果行は部署名とその部署の従業員総数となります。
クエリ:
SELECT Department, count(*) FROM employees_guru GROUP BY Department;
並べ替え
SORT BY句は、Hiveテーブルの列名に基づいて出力をソートします。降順でソートする場合はDESC、昇順でソートする場合はASCを指定できます。
SORT BY は、行をリデューサーに渡す前にソートするため、結果全体ではなく、各リデューサー内で順序が保証されます。ソートは常に列の型に依存します。
例えば、列の型が数値であれば数値順にソートされ、列の型が文字列であれば辞書順にソートされます。
以下のスクリーンショットは、降順(DESC)を使用したSORT BYクエリを示しています。
上記のスクリーンショットから、次のことがわかります。
- これは、SORT BY句と定義されたSORT BY列名「Id」を使用して、「employees_guru」テーブルに対して実行されたクエリです。キーワードDESCを使用しました。
- したがって、表示される出力は「Id」の降順になります。
クエリ:
SELECT * from employees_guru SORT BY Id DESC;
Cluster By
HiveQLでは、CLUSTER BYはDISTRIBUTE BY句とSORT BY句の両方の代替として使用されます。
Hive のテーブルでは、CLUSTER BY 句が使用されます。Hive は CLUSTER BY 句で指定された列を使用して、行をリデューサー間で分散します。CLUSTER BY 句で指定された列は複数のリデューサーに渡されます。また、複数のリデューサーに存在する値のソート順も保証されます。
例えば、employees_guruテーブルのId列名にCLUSTER BY句が指定されています。このクエリを実行すると、バックエンドでは複数のリデューサーに結果が渡されますが、フロントエンドではSORT BYとDISTRIBUTE BYの両方の代替句として機能します。
これは、MapReduceフレームワークにおいて、SORT BY、GROUP BY、またはCLUSTER BYを使用してクエリを実行する際のバックエンド処理です。したがって、結果を複数のリデューサーに格納したい場合は、CLUSTER BYを使用します。
CLUSTER BY構文は列名のみを受け付けるため、ASCとDESCを付加することはできません。降順の結果を得るには、DISTRIBUTE BYとSORT BY … DESCを別途指定する必要があります。
以下のスクリーンショットは、Id に対する CLUSTER BY クエリを示しています。
上記のスクリーンショットから、次のことがわかります。
- これは、IDフィールドの値に対してCLUSTER BY句を実行するクエリです。ここでは、ID値に基づいてソートが行われます。
- employees_guru に存在する Id と Name の値をソートされた順序で表示します。
クエリ:
SELECT Id, Name from employees_guru CLUSTER BY Id;
配布者
Hive のテーブルでは、DISTRIBUTE BY 句が使用されます。Hive は DISTRIBUTE BY 句の列を使用して行をリデューサーに分散するため、同じ DISTRIBUTE BY 列の値を持つすべての行は同じリデューサーに送られます。
- これにより、N 個のリデューサーそれぞれが重複のない信号を受け取ることが保証されます。ping 列の値のセット
- 各リデューサーの出力はソートされず、一致する行が必ずしも隣り合うとは限りません。
以下のスクリーンショットは、ID に対する DISTRIBUTE BY クエリを示しています。
上記のスクリーンショットから、以下のことが分かります。
- DISTRIBUTE BY句は、「employees_guru」テーブルのIDに対して実行されます。
- 出力にはIDと名前が表示されます。バックエンドでは、同じIDを持つ行は同じリデューサーに送られます。
クエリ:
SELECT Id, Name from employees_guru DISTRIBUTE BY Id;
これら4つの条項は混同しやすいので、以下の表で比較します。
| 句 | レデューサー | それが保証するもの |
|---|---|---|
| ORDER BY | 1 | 結果全体にわたる総順序 |
| SORT BY | その他にもたくさんのグーグルの | 各減速機内での注文のみ |
| 配布元 | その他にもたくさんのグーグルの | 同じキーが同じリデューサーに到達し、ソートされない |
| クラスター別 | その他にもたくさんのグーグルの | 分配基準と昇順による並べ替え |






