spark createOrReplaceTempView vs createGlobalTempView

时间:2017-03-13 21:58:47

标签: apache-spark apache-spark-dataset

Spark数据集2.0提供了两个函数createOrReplaceTempViewcreateGlobalTempView。我无法理解两种功能之间的基本区别。

根据API documents

createOrReplaceTempView :这个的生命周期 临时视图与用于创建此数据集的[[SparkSession]]相关联。
所以,当我调用sparkSession.close()时,定义的将被销毁。这是真的吗?

createGlobalTempView :此临时视图的生命周期与此Spark应用程序绑定。

何时会破坏这种类型的视图?任何例子。比如sparkSession.close()?

3 个答案:

答案 0 :(得分:20)

您的问题的答案基本上是了解Spark应用程序和Spark会话的区别。

可以使用Spark应用程序:

  • 用于单个批处理作业
  • 具有多个作业的交互式会话
  • 长期服务器不断满足要求
  • Spark作业不仅可以包含一个地图,还可以包含reduce。
  • Spark应用程序可以包含多个会话

另一方面,SparkSession与Spark应用程序相关联:

  • 通常,会话是两个或多个实体之间的交互。
  • 在Spark 2.0中,您可以使用SparkSession
  • 可以在不创建SparkConf,SparkContext或SQLContext的情况下创建SparkSession(它们封装在SparkSession中)

Spark 2.1.0版本中引入了全局临时视图。当您想要在不同会话之间共享数据并保持活着直到您的应用程序结束时,此功能非常有用。请参阅我编写的一个镜头示例,以说明createTempViewcreateGlobalTempView的使用

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()
  }
}

答案 1 :(得分:14)

df.createOrReplaceTempView("tempViewName")
df.createGlobalTempView("tempViewName")

createOrReplaceTempView()使用此数据框df创建或替换本地临时视图。此视图的生命周期取决于SparkSession类,是否要删除此视图:

spark.catalog.dropTempView("tempViewName")

stop()将关闭会话

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

createGlobalTempView()使用此数据框df创建全局临时视图。这种观点的生命周期取决于火花应用本身。 如果你想放弃:

spark.catalog.dropGlobalTempView("tempViewName")

stop()将关闭

ss =  SparkContext(conf=conf, ......)
...
ss.stop()

答案 2 :(得分:1)

Spark 2.0中引入了

createOrReplaceTempView来代替registerTempTable。 CreateTempView创建对使用中的数据框的内存中引用。此操作的生存期取决于在其中创建Dataframe的Spark会话。另一方面,createGlobalTempView允许您创建可在Spark会话之间使用的引用。因此,根据是否需要跨会话共享数据,可以使用这两种方法。默认情况下,同一群集中的笔记本共享相同的spark会话,但是有一个选项可以设置每个笔记本都有自己的会话的群集。因此,归结为您要在哪里创建数据框以及要在哪里访问它。