【Hive】Hive / HiveQL ~ JOIN文 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2021/06/12/093046

に関して、細かく調査したら、JOIN の ON がないので、
交差結合(CROSS JOIN, Cartesian product)になり
エラーが起きてたのが分かった。

そこで、今回は JOIN文について、改めて纏めてみる。

目次

【0】構文
 1)JOINの種類
【1】INNER JOIN
 1)使用上の注意
【2】LEFT|RIGHT|FULL OUTER JOIN
【3】LEFT SEMI JOIN
【4】CROSS JOIN
 1)使用上の注意

【0】構文

* HiveでもJOIN(内部結合/外部結合)はサポートされている

公式サイト
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins

-- より抜粋

join_table:
    table_reference [INNER] JOIN table_factor [join_condition]
  | table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition
  | table_reference LEFT SEMI JOIN 

table_reference join_condition
  | table_reference CROSS JOIN table_reference [join_condition]

1)JOINの種類

【1】INNER JOIN
【2】LEFT|RIGHT|FULL OUTER JOIN
【3】LEFT SEMI JOIN
【4】CROSS JOIN

【1】INNER JOIN

* SQL の INNER JOIN と同じ

テーブルの結合 ~ 内部結合・INNER JOIN ~
https://dk521123.hatenablog.com/entry/2010/02/05/131206

1)使用上の注意

* JOIN ... ON ... は、INNER JOIN ... ON ... と同じ
* JOIN(ONなし)は、CROSS JOINになる(詳細は「【4】CROSS JOIN」を参照)

【2】LEFT|RIGHT|FULL OUTER JOIN

* SQL と同じ

テーブルの結合 ~ 外部結合・LEFT/RIGHT/FULL JOIN ~
https://dk521123.hatenablog.com/entry/2012/05/06/212246

【3】LEFT SEMI JOIN

* JOIN 条件が有効な場合は、左の表のデータが返す

サンプル

SELECT
 a.key,
 a.val
FROM
 sample1 a
LEFT SEMI JOIN
 sample2 b
ON
 a.key = b.key;

-- 以下と同じ
SELECT a.key, a.value
FROM sample1 a
WHERE a.key in
 (SELECT b.key
  FROM sample2 b);

参考文献
https://qiita.com/KamekoKameKame/items/93d61a2a469c43e48dea
https://recruit.gmo.jp/engineer/jisedai/blog/hive-on-tez-hdp232/

【4】CROSS JOIN

* CROSS JOIN に関する詳細は、以下の関連記事を参照のこと

テーブル結合 ~ 交差結合・CROSS JOIN ~
https://dk521123.hatenablog.com/entry/2011/12/21/000000

1)使用上の注意

* CROSS JOINは、基本サポート外
 => 実行すると、エラー「SemanticException」になる。
 => 対応策などの詳細については、以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2021/06/12/093046

* JOIN(ONなし)でも代用可能

エラー「SemanticException」が発生した HQL

SELECT
 *
FROM
 table1 t1
JOIN
 table2 t2
-- ON がないので、交差結合(CROSS JOIN)になっている
WHERE
 t1.create_at > t2.create_at
;

参考文献

https://open-groove.net/hive/hive-join/
https://www.finddevguides.com/Hiveql-joins

関連記事

Hive / HiveQL ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2019/11/25/235219
Hive / HiveQL ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/02/25/231235
Hive / HiveQL ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/06/02/183823
Hive / HiveQL ~ あれこれ編 ~
https://dk521123.hatenablog.com/entry/2020/03/04/225943
エラー「SemanticException Cartesian products are disabled for safety reasons」が発生する
https://dk521123.hatenablog.com/entry/2021/06/12/093046
全く関係ないテーブルを結合することを考える
https://dk521123.hatenablog.com/entry/2021/09/16/185552