Hive クエリ: 並べ替え、グループ化、配布、 Cluster 例によって
Hive は、ETL を目的とした SQL 型クエリ言語を提供します。 Hadoopの ファイルシステム。
Hive クエリ言語 (HiveQL) は、テーブル、データベース、クエリを操作するための SQL 型環境を Hive に提供します。
異なるタイプの句を Hive に関連付けて、異なるタイプのデータ操作やクエリを実行できます。 環境外のさまざまなノードとの接続を向上させるため。 HIVE は JDBC 接続も提供します。
Hive クエリは次の機能を提供します。
- データベースやテーブルの作成などのデータモデリング
- データの抽出、変換、テーブルへのロードなどの ETL 機能
- ジョイン 異なるデータテーブルをマージするには
- コードを容易にするユーザー固有のカスタム スクリプト
- Hadoop 上の高速クエリ ツール
Hive でのテーブルの作成
このチュートリアルの主なトピックを始める前に、まず次のチュートリアルの参照として使用する表を作成します。
このチュートリアルでは、6 つの列を持つテーブル「employees_guru」を作成します。
上のスクリーンショットから、
- 組織「guru」に所属する従業員に属する、ID、名前、年齢、住所、給与、部署などの 6 つの列値を持つテーブル「employees_guru」を作成しています。
- このステップでは、employees_guru テーブルにデータをロードしています。 ロードするデータは、Employees.txt ファイルの下に配置されます。
クエリによる注文
HiveQL の ORDER BY 構文は、HiveQL の ORDER BY の構文と似ています。 SQL 言語。
Order by は、「SELECT」ステートメントで使用する句です。 ハイブクエリ、データの並べ替えに役立ちます。 Order by 句は、Order by で説明されている特定の列値を並べ替えるために Hive テーブルの列を使用します。 order by 句を定義している列名が何であれ、クエリは特定の列値を昇順または降順で選択して結果を表示します。
前述の order by フィールドが文字列の場合、結果が辞書順に表示されます。 バックエンドでは、単一のリデューサーに渡す必要があります。
上記のスクリーンショットから、次のことがわかります。
- これは、ORDER BY 列名としてDepartment を定義し、ORDER BY 句を使用して「employees_guru」テーブルに対して実行するクエリです。「Department」は文字列であるため、辞書順に基づいて結果が表示されます。
- これはクエリの実際の出力です。これをよく観察すると、クエリを実行する順序に応じて、ADMIN、Finance などの Department 列に基づいて結果が表示されていることがわかります。
クエリ:
SELECT * FROM employees_guru ORDER BY Department;
クエリごとにグループ化する
Group by 句では、Hive テーブルの列を使用して、group by で指定された特定の列値をグループ化します。 「groupby」句を定義している列名が何であれ、クエリは特定の列値をグループ化することによって結果を選択し、表示します。
たとえば、以下のスクリーンショットでは、各部門に存在する従業員の合計数が表示されます。 ここでは、値によるグループとして「部門」を指定しています。
上記のスクリーンショットから、次のことがわかります。
- これは、定義された GROUP BY 列名として部門を指定した GROUP BY 句を使用して、「employees_guru」テーブルに対して実行されるクエリです。
- ここで表示される出力は、部門名と、各部門の従業員数です。ここでは、特定の部門に属するすべての従業員がグループ化され、結果に表示されます。したがって、結果は、部門名と各部門に存在する従業員の総数になります。
クエリ:
SELECT Department, count(*) FROM employees_guru GROUP BY Department;
並べ替え
Sort by 句は、Hive テーブルの列名に対して実行して、出力を並べ替えます。 降順で並べ替えるには DESC を指定し、昇順で並べ替えるには ASC を指定します。
この並べ替えでは、リデューサーに供給する前に行が並べ替えられます。 常に列の種類に応じて並べ替えます。
たとえば、列の型が数値の場合は数値順に並べ替えられ、列の型が文字列の場合は辞書編集順に並べ替えられます。
上記のスクリーンショットから、次のことがわかります。
- テーブル「employees_guru」に対してSORT BYカラム名を定義した「id」を指定したSORT BY句を実行するクエリです。 キーワード DESC を使用しました。
- したがって、表示される出力は「id」の降順になります。
クエリ:
SELECT * from employees_guru SORT BY Id DESC;
Cluster By
Cluster Hive-QL の Distribute BY 句と Sort BY 句の両方の代替として使用されます。
Cluster Hive に存在するテーブルで使用される BY 句。 Hive は次の列を使用します。 Cluster レデューサー間で行を分散することによって。 Cluster BY 列は複数の Reducer に送られます。
- 複数のレデューサーに存在する値のソート順を保証します。
たとえば、 Cluster テーブルemployees_guruテーブルのID列名に記載されているBy句。このクエリを実行するときの出力は、バックエンドの複数のリデューサーに結果を与えます。ただし、フロントエンドとしては、Sort By と Distribute By の両方の代替句です。
これは実際には、MapReduceフレームワークの観点からソート、グループ化、クラスタリングによるクエリを実行するバックエンドプロセスです。したがって、結果を複数のリデューサーに格納したい場合は、次のようにします。 Cluster によって。
上記のスクリーンショットから、次のことがわかります。
- これは、Id フィールド値に対して CLUSTER BY 句を実行するクエリです。ここでは、Id 値に基づいて並べ替えが行われます。
- guru_employees に存在する ID と名前がソート順に表示されます。
クエリ:
SELECT Id, Name from employees_guru CLUSTER BY Id;
配布者
Hive に存在するテーブルで使用される BY 句を配布します。 Hive は、Distribute by の列を使用して、Reducer 間で行を分散します。 すべての Distribute BY 列は同じリデューサーに送られます。
- これにより、N 個の各リデューサーが列の重複しない範囲を取得できるようになります。
- 各リデューサーの出力を並べ替えません。
上記のスクリーンショットから、次のことがわかります。
- 「empoloyees_guru」テーブルの ID に対して実行される DISTRIBUTE BY 句
- ID、名前を表示する出力。バックエンドでは同じリデューサーに送られます。
クエリ:
SELECT Id, Name from employees_guru DISTRIBUTE BY Id;