Hive 結合とサブクエリのチュートリアルと例

結合クエリ

結合クエリは、Hive に存在する 2 つのテーブルに対して実行できます。ご理解いただくために 参加 Concepts ここで 2 つのテーブルを作成していることは明らかですが、

  • Sample_joins(顧客詳細に関連)
  • Sample_joins1(従業員が行った注文の詳細に関連)

ステップ1) 従業員のID、名前、年齢、住所、給与を列名とするテーブル「sample_joins」の作成

結合クエリ

ステップ2) データのロードと表示

結合クエリ

上のスクリーンショットより

  1. Customers.txtからsample_joinsにデータをロードする
  2. Sample_joins テーブルの内容の表示

ステップ3) Sample_joins1 テーブルの作成とデータのロード、表示

結合クエリ

上記のスクリーンショットから、次のことがわかります。

  1. Orderid、Date1、Id、Amount 列を含むテーブル sample_joins1 の作成
  2. order.txtからsample_joins1にデータをロードする
  3. Sample_joins1 に存在するレコードを表示しています

これから、作成したテーブルで実行できるさまざまな種類の結合について説明しますが、その前に、結合に関して次の点を考慮する必要があります。

結合で観察すべきいくつかの点:

  • 結合では等価結合のみが許可されます
  • 同じクエリ内で XNUMX つ以上のテーブルを結合できます
  • LEFT、RIGHT、FULL OUTER 結合は、一致しない ON 句をより詳細に制御するために存在します。
  • 結合は可換ではありません
  • 結合は、LEFT 結合か RIGHT 結合かに関係なく、左結合になります。

さまざまな種類の結合

結合には 4 つのタイプがあります。

  • 内部結合
  • 左外部結合
  • 右外部結合
  • 完全外部結合

内部結合:

この内部結合により、両方のテーブルに共通するレコードが取得されます。

内部結合

上記のスクリーンショットから、次のことがわかります。

  1. ここでは、テーブルsample_joinsとsample_joins1の間でJOINキーワードを使用し、一致条件(c.Id= o.Id)を使用して結合クエリを実行しています。
  2. クエリで指定された条件をチェックして、両方のテーブルに存在する共通レコードを表示する出力

クエリ:

SELECT c.Id, c.Name, c.Age, o.Amount FROM sample_joins c JOIN sample_joins1 o ON(c.Id=o.Id);

左外部結合:

  • Hive クエリ言語 LEFT OUTER JOIN は、右側のテーブルに一致するものがない場合でも、左側のテーブルのすべての行を返します。
  • ON 句が右側のテーブルのレコードに一致しない場合でも、結合は右側のテーブルの各列に NULL を含む結果のレコードを返します。

左外部結合

上記のスクリーンショットから、次のことがわかります。

  1. ここでは、テーブルsample_joinsとsample_joins1の間で「LEFT OUTER JOIN」キーワードを使用し、一致条件を(c.Id= o.Id)として結合クエリを実行しています。例えば、 ここでは従業員 ID を参照として使用しており、ID がテーブルの右側と左側で共通であるかどうかをチェックします。 一致条件として機能します。
  2. クエリで指定された条件をチェックして、両方のテーブルに存在する共通のレコードを表示する出力。上記の出力の NULL 値は、sample_joins1 である右側のテーブルの値のない列です。

クエリ:

SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c LEFT OUTER JOIN sample_joins1 o ON(c.Id=o.Id)

右外部結合:

  • Hive クエリ言語 RIGHT OUTER JOIN は、左側のテーブルに一致するものがない場合でも、右側のテーブルからすべての行を返します。
  • ON 句が左側のテーブルのゼロレコードと一致する場合でも、結合は左側のテーブルの各列に NULL を含む結果のレコードを返します。
  • RIGHT 結合は常に、右側のテーブルからレコードを返し、左側のテーブルから一致したレコードを返します。 左側のテーブルにその列に対応する値がない場合は、その場所に NULL 値が返されます。

右外部結合

上記のスクリーンショットから、次のことがわかります。

  1. ここでは、テーブルsample_joinsとsample_joins1の間で「RIGHT OUTER JOIN」キーワードを使用し、一致条件を(c.Id= o.Id)として結合クエリを実行しています。
  2. クエリで指定された条件をチェックして、両方のテーブルに存在する共通レコードを表示する出力

クエリー:

  SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c RIGHT OUTER JOIN sample_joins1 o ON(c.Id=o.Id)

完全外部結合:

クエリで指定された JOIN 条件に基づいて、sample_joins テーブルとsample_joins1 テーブルの両方のレコードを結合します。

両方のテーブルからすべてのレコードを返し、どちらかの側で一致する値が欠落している列には NULL 値を埋めます。

完全外部結合

上記のスクリーンショットから、次のことがわかります。

  1. ここでは、テーブルsample_joinsとsample_joins1の間で「FULL OUTER JOIN」キーワードを使用し、一致条件(c.Id= o.Id)で結合クエリを実行しています。
  2. クエリで指定された条件をチェックして、両方のテーブルに存在するすべてのレコードを表示する出力。 ここでの出力の NULL 値は、両方のテーブルの列に値が欠落していることを示します。

クエリー

SELECT c.Id, c.Name, o.Amount, o.Date1 FROM sample_joins c FULL OUTER JOIN sample_joins1 o ON(c.Id=o.Id)

サブクエリ

クエリ内に存在するクエリはサブクエリと呼ばれます。 メイン クエリは、サブクエリによって返される値に依存します。

サブクエリは XNUMX つのタイプに分類できます

  • FROM 句のサブクエリ
  • WHERE 句のサブクエリ

使用する場合:

  • 異なるテーブルの XNUMX つの列の値を組み合わせた特定の値を取得するには
  • あるテーブル値の他のテーブルへの依存関係
  • 他のテーブルからの XNUMX つの列の値の比較チェック

構文:

Subquery in FROM clause
SELECT <column names 1, 2…n>From (SubQuery) <TableName_Main >
Subquery in WHERE clause
SELECT <column names 1, 2…n> From<TableName_Main>WHERE col1 IN (SubQuery);

例:

SELECT col1 FROM (SELECT a+b AS col1 FROM t1) t2

ここで、t1 と t2 はテーブル名です。 色付きのものはテーブル t1 に対して実行されたサブクエリです。 ここで、a と b はサブクエリに追加され、col1 に割り当てられる列です。 Col1 はメインテーブルに存在する列の値です。 サブクエリに存在するこの列「col1」は、列col1のメインテーブルクエリと同等です。

カスタムスクリプトの埋め込み

ハイブ クライアントの要件に合わせてユーザー固有のスクリプトを作成できるようになります。 ユーザーは独自のマップを作成し、要件に合わせてスクリプトを減らすことができます。 これらは、埋め込みカスタム スクリプトと呼ばれます。 コーディング ロジックはカスタム スクリプトで定義されており、ETL 時にそのスクリプトを使用できます。

埋め込みスクリプトを選択する場合:

  • クライアント固有の要件では、開発者は Hive でスクリプトを作成してデプロイする必要があります
  • Hive の組み込み関数が特定のドメイン要件に対して機能しない場合

このために、Hive では TRANSFORM 句を使用して、マップ スクリプトとリデューサー スクリプトの両方を埋め込みます。

この埋め込みカスタムスクリプトでは、次の点に注意する必要があります。

  • 列は文字列に変換され、ユーザー スクリプトに渡される前に TAB で区切られます。
  • ユーザースクリプトの標準出力はタブ区切りの文字列列として扱われます。

サンプル埋め込みスクリプト、

FROM (
	FROM pv_users
	MAP pv_users.userid, pv_users.date
	USING 'map_script'
	AS dt, uid
	CLUSTER BY dt) map_output

INSERT OVERWRITE TABLE pv_users_reduced
	REDUCE map_output.dt, map_output.uid
	USING 'reduce_script'
	AS date, count;

上記のスクリプトから、次のことがわかります。

これは理解のためのサンプル スクリプトにすぎません

  • pv_users は、map_script で説明されているように、ユーザー ID や日付などのフィールドを持つユーザー テーブルです。
  • pv_users テーブルの日付と数に基づいて定義された Reducer スクリプト