Apache SparkのSpark SQLでは、一時的なテーブルとして「ビュー(View)」を作成できます。このビューには、そのスコープに応じて2つの種類があります。
Spark SQLにおけるビューの種類
-
テンポラリ・ビュー (Temporary View):
- 作成された
SparkSession
にのみ関連付けられます。 - ビューの名前空間は、そのビューを作成した
SparkSession
の内部に限定されます。 SparkSession
が終了すると、テンポラリ・ビューも自動的に破棄されます。- デフォルトで作成されるビューはテンポラリ・ビューです。
- 作成された
-
グローバル・テンポラリ・ビュー (Global Temporary View):
SparkSession
ではなく、Sparkアプリケーション全体で共有されるSparkSession
のインスタンスに関連付けられます。- ビューの名前空間は、Sparkアプリケーション内の全ての
SparkSession
で共有されます。 SparkSession
が終了しても破棄されず、Sparkアプリケーションが終了するまで存続します。CREATE GLOBAL TEMPORARY VIEW
構文で作成されます。
並列実行時の名前空間の衝突
Spark SQLのクエリを並列実行する際、ビューの名前空間の衝突が問題になるかどうかは、使用するビューの種類によって異なります。
-
テンポラリ・ビューの場合: テンポラリ・ビューは、それぞれ独立した
SparkSession
に関連付けられます。Sparkの並列処理において、各タスクやスレッドが独自のSparkSession
を持つ場合、それぞれのSparkSession
内で作成されたテンポラリ・ビューは、他のSparkSession
のビューとは独立した名前空間を持ちます。 したがって、テンポラリ・ビューを並列実行した場合に、ビューの名前空間が衝突する問題は発生しません。 -
グローバル・テンポラリ・ビューの場合: グローバル・テンポラリ・ビューは、Sparkアプリケーション全体で共有されるため、複数の
SparkSession
から同じ名前のグローバル・テンポラリ・ビューを作成しようとすると、名前空間の衝突が発生します。
結論
Spark SQLにおいて、特に明示的に GLOBAL
キーワードを使用しない限り、デフォルトで作成されるビューはテンポラリ・ビューです。テンポラリ・ビューは各 SparkSession
にスコープが限定されるため、基本的に並列実行でビューの名前空間が衝突することはありません。
もし、複数の SparkSession
間でビューを共有する必要がある場合は、グローバル・テンポラリ・ビューを使用することになりますが、その際は名前の衝突を避けるための命名規則や管理方法を考慮する必要があります。