【トラブル】【Hive】エラー「SemanticException Cartesian products are disabled for safety reasons」が発生する

■ はじめに

https://dk521123.hatenablog.com/entry/2020/05/28/175428
https://dk521123.hatenablog.com/entry/2020/11/20/174039

の続き。

今回は、別環境で動いているHQLを実行したら
エラーになった際のトラブルシュートをメモする。

目次

【1】概要
【2】エラー内容
【3】原因
【4】解決案
【5】補足:Hive の 設定値について
 1)hive.strict.checks.cartesian.product
 2)hive.mapred.mode

【1】概要

別環境で動いていたかなり長めのHQL (UNION ALL や JOIN含む)を
AWS EMR上で実行したら、
エラー「SemanticException Cartesian products are disabled ...」
(詳細は、以下「エラー内容」を参照)が発生した。

発生したHQL

use sample_db;

SELECT
 *
FROM
 table1 t1
JOIN
 table2 t2
WHERE
 t1.create_at > t2.create_at
;

【2】エラー内容

SemanticException Cartesian products are disabled for safety reasons.
If you know what you are doing,
please sethive.strict.checks.cartesian.product to false 
and that hive.mapred .mode is not set to 'strict' to proceed.
Note that if you may get errors or incorrect results
 if you make a mistake while using some of the unsafe features.

# 「sethive.strict.checks.cartesian.product」ってなってるから分かりづらいが
# 「set hive.strict.checks.cartesian.product」だと、、、

【3】原因

* エラー内容をよく読むと、原因と解決方法が書かれている

エラー内容の意訳

1文目(原因が記載)

SemanticException Cartesian products are disabled for safety reasons.
=> SemanticException 交差結合は安全性の理由から無効にしています。
cf. Semantic = セマンティック, 意味論

2文目(解決方法が記載。具体的には「【3】解決案」を参照)

If you know what you are doing,
please set hive.strict.checks.cartesian.product to false 
and that hive.mapred .mode is not set to 'strict' to proceed.
=> もし、あなたが何をするかを知りたければ、
 「hive.strict.checks.cartesian.product」をfalse に設定して下さい
 そして、実行するために
 「hive.mapred .mode」は 'strict' を設定しないでください

3文目

Note that if you may get errors or incorrect results
 if you make a mistake while using some of the unsafe features.
=> いくつかの非安全性の機能を使っている間に間違いがある場合
 エラーもしくは正しい結果にならなかった場合に注意してください。
(アンセーフモードにした場合に、
 誤った結果やエラーが起きることがあるよってこと?)

今回の場合は...

* JOIN の ON がないので、交差結合(CROSS JOIN)になっていた
 => JOIN文に関する詳細は、以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2021/06/16/152019
HQL

SELECT
 *
FROM
 table1 t1
JOIN
 table2 t2
-- ON がないので、交差結合(CROSS JOIN)になっていた
-- ちなみに、WHERE => ONにしても同じエラー
WHERE
 t1.create_at > t2.create_at
;

【3】解決案

HQL実行前に、以下を実行する。
~~~~~~~
set hive.strict.checks.cartesian.product=false;
set hive.mapred.mode=nonstrict;
~~~~~~~

【4】補足:Hive の 設定値について

1)hive.strict.checks.cartesian.product

* hive.strict.checks.cartesian.product = true / false

* いくら調べても、有効な情報がない...

* cf.  Cartesian product = デカルト積、直積 => クロス結合、交差結合
 => true の場合、厳密に交差結合をチェックする?
 (交差結合を行わないようにする?)
 => false の場合、交差結合を許容する?
 => 交差結合については、以下の関連記事を参照のこと。

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

2)hive.mapred.mode

* hive.mapred.mode = strict / nonstrict
* cf. mapred = MapReduce?

https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties

より抜粋
~~~~~~~~~~~
Default Value: << デフォルト値がバージョンによって異なる
  Hive 0.x: nonstrict
  Hive 1.x: nonstrict
  Hive 2.x: strict (HIVE-12413)

Added In: Hive 0.3.0

In strict mode, some risky queries are not allowed to run.
# 「strict」モード (厳密モード) の場合、
# 危険なクエリの実行を許可しません。

For example, full table scans are prevented (see HIVE-10454)
 and ORDER BY requires a LIMIT clause.
# 例えば、フルテーブルスキャンを避け、
# ORDER BY句は、LIMIT句を必要とします。
~~~~~~~~~~~

参考文献

https://www.programmersought.com/article/73934182984/
https://knowledge.informatica.com/s/article/522983?language=en_US

関連記事

Amazon EMR に関するトラブルシューティング
https://dk521123.hatenablog.com/entry/2020/08/05/144724
EMR / DBアクセス に関するトラブルシューティング
https://dk521123.hatenablog.com/entry/2021/06/17/114611
Hive / Partition に関するトラブルシューティング
https://dk521123.hatenablog.com/entry/2020/05/28/175428
Hive / HiveQL ~ 設定プロパティ ~
https://dk521123.hatenablog.com/entry/2020/09/19/152136
Hive / HiveQL ~ パーティション / あれこれ編 ~
https://dk521123.hatenablog.com/entry/2020/09/18/113637
Hive / HiveQL ~ JOIN文 ~
https://dk521123.hatenablog.com/entry/2021/06/16/152019
テーブル結合 ~ 交差結合・CROSS JOIN ~
https://dk521123.hatenablog.com/entry/2011/12/21/000000