【问题标题】:spark createOrReplaceTempView vs createGlobalTempView火花 createOrReplaceTempView 与 createGlobalTempView
【发布时间】:2017-08-04 02:12:42
【问题描述】:

Spark Dataset 2.0 提供了两个函数createOrReplaceTempViewcreateGlobalTempView。我无法理解这两个函数之间的基本区别。

API documents

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

createGlobalTempView:此临时视图的生命周期与此 Spark 应用程序相关联。

这种类型的视图什么时候会被销毁?任何例子。喜欢 sparkSession.close()?

【问题讨论】:

标签: apache-spark apache-spark-dataset


【解决方案1】:
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()

【讨论】:

  • 根据我的理解,当您调用sparkContext.stop() 时,这两种视图都会被破坏。应用程序关闭在哪里出现?
  • SparkSession 类需要一个 SparkContext 对象,如果 sparkContext 停止,它们都会被销毁。如果您不调用 stop() 方法,您的应用程序可能会挂起。您不需要 SparkSession 或 SparkContext 对象然后停止它们。因此,火花主节点将知道您的应用程序没有消耗或使用 CPU 或资源。见:apache-spark-user-list.1001560.n3.nabble.com/…
  • 只是为了补充一个很棒的答案:Spark Session 等同于 Pre Spark2.0 时代的 sqlContext。
  • 停止功能是否也会删除已创建的配置单元数据库/表
【解决方案2】:

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

可以使用Spark应用:

  • 对于单个批处理作业
  • 具有多个作业的交互式会话
  • 持续满足请求的长期服务器
  • Spark 作业可以不只包含一个 map 和 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()
  }
}

【讨论】:

  • 感谢您的详细解释。
  • @Avi Chalbani 我在做同样的事情时遇到错误,如何解决它?df.createOrReplaceGlobalTempView("model_vals") 错误:org.apache.spark.sql.catalyst.analysis.NoSuchTableException : 在数据库“默认”中找不到表或视图“model_vals”;
  • 嗨,如果我想在 SQL 中使用表,我应该使用 'global_temp' 前缀吗?
  • 我可以像这样使用临时表或视图吗spark.sql("SELECT * FROM logdata").show() 谢谢。
  • 大家好,任何人都可以阐明我们可能想要创建newSession 的用例吗?创建新会话有什么好处?
【解决方案3】:

createOrReplaceTempView 已在 Spark 2.0 中引入以替换 registerTempTable。 CreateTempView 创建对正在使用的 Dataframe 的内存引用。其生命周期取决于在其中创建 Dataframe 的 spark 会话。另一方面,createGlobalTempView 允许您创建可跨 spark 会话使用的引用。因此,根据您是否需要跨会话共享数据,您可以使用任何一种方法。默认情况下,同一集群中的笔记本共享相同的 spark 会话,但可以选择设置集群,其中每个笔记本都有自己的会话。所以归根结底就是你在哪里创建数据框以及你想在哪里访问它。

【讨论】:

    猜你喜欢
    • 2017-09-24
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    相关资源
    最近更新 更多