web-dev-qa-db-ja.com

spark createOrReplaceTempView vs createGlobalTempView

Spark Dataset 2.0は、2つの関数createOrReplaceTempViewcreateGlobalTempViewを提供します。両方の機能の基本的な違いを理解できません。

APIドキュメント によると:

createOrReplaceTempView:この一時ビューの有効期間は、このデータセットの作成に使用された[[SparkSession]]に関連付けられています。
したがって、sparkSession.close()を呼び出すと、定義されたものは破棄されます。本当ですか?

createGlobalTempView:この一時ビューの有効期間は、このSpark application。

このタイプのビューはいつ破棄されますか?任意の例。 sparkSession.close()?

19
Rahul Sharma
_df.createOrReplaceTempView("tempViewName")
df.createGlobalTempView("tempViewName")
_

createOrReplaceTempView()は、ローカルの一時ビューをこのデータフレームdfで作成または置換します。このビューの寿命はSparkSessionクラスに依存していますが、このビューを削除しますか?

_spark.catalog.dropTempView("tempViewName")
_

またはstop()はセッションをシャットダウンします

_self.ss = SparkSession(sc)
...
self.ss.stop()
_

createGlobalTempView()は、このデータフレームdfを使用してグローバル一時ビューを作成します。このビューの存続時間はsparkアプリケーション自体に依存します。ドロップしたい場合:

_spark.catalog.dropGlobalTempView("tempViewName")
_

またはstop()はシャットダウンします

_ss =  SparkContext(conf=conf, ......)
...
ss.stop()
_
18
Gökhan Ayhan

あなたの質問への答えは、基本的にSpark Applicationとa Spark Session。

Sparkアプリケーションを使用できます:

  • 単一バッチジョブの場合
  • 複数のジョブを含む対話型セッション
  • リクエストを継続的に満たす長寿命のサーバー
  • Sparkジョブは、単一のマップ以上のもので構成され、削減できます。
  • Sparkアプリケーションは複数のセッションで構成できます

一方、SparkSessionは、Spark Application:

  • 一般に、セッションは2つ以上のエンティティ間の相互作用です。
  • in Spark 2.0 SparkSessionを使用できます
  • SparkSessionは、SparkConf、SparkContext、またはSQLContextを作成せずに作成できます(SparkSession内にカプセル化されます)

グローバル一時ビューは、Spark 2.1.0リリースで導入されました。この機能は、異なるセッション間でデータを共有し、アプリケーションが終了するまで存続させたい場合に役立ちます。 createTempViewおよびcreateGlobalTempViewの使用方法を示します

object NewSessionApp {

  def main(args: Array[String]): Unit = {

    val logFile = "data/README.md" // Should be some file on your system
    val spark = SparkSession.
      builder.
      appName("Simple Application").
      master("local").
      getOrCreate()

    val logData = spark.read.textFile(logFile).cache()
    logData.createGlobalTempView("logdata")
    spark.range(1).createTempView("foo")

    // within the same session the foo table exists 
    println("""spark.catalog.tableExists("foo") = """ + spark.catalog.tableExists("foo"))
    //spark.catalog.tableExists("foo") = true

    // for a new session the foo table does not exists
    val newSpark = spark.newSession
    println("""newSpark.catalog.tableExists("foo") = """ + newSpark.catalog.tableExists("foo"))
    //newSpark.catalog.tableExists("foo") = false

    //both session can access the logdata table
    spark.sql("SELECT * FROM global_temp.logdata").show()
    newSpark.sql("SELECT * FROM global_temp.logdata").show()

    spark.stop()
  }
}
26
Avi Chalbani