Spark SQL-临时视图、创建临时表的3种各种方式

Spark中的临时表/视图创建方式

  • spark-sql createOrReplaceTempView 和createGlobalTempView区别
  • Spark Application
    Spark Application 使用:
  1. 针对单个批处理作业
  2. 多个job通过session交互式
  3. 不断满足请求的,长期存在的server
  4. 一个Spark job 可以包含多个map和reduce
  5. Spark Application 可以包含多个session实例
  6. createOrReplaceTempView:创建临时视图,此视图的生命周期与用于创建此数据集的[SparkSession]相关联。
  • Spark Session
    SparkSession与Spark应用程序相关联:
  1. session 是两个或更多实体之间的交互媒介
  2. 在Spark 2.0中,你可以使用SparkSession创建
  3. 可以在不创建SparkConf,SparkContext或SQLContext的情况下创建SparkSession(它们封装在SparkSession中)

一、createOrReplaceTempView使用

createOrReplaceTempView:创建临时视图,此视图的生命周期与用于创建此数据集的[SparkSession]相关联。

df.createOrReplaceTempView("tempViewName")
df.createGlobalTempView("tempViewName")
  • createOrReplaceTempView(): 创建或替换本地临时视图。

此视图的生命周期依赖于SparkSession类,如果想drop此视图可采用dropTempView删除

spark.catalog.dropTempView("tempViewName")

或者 stop() 来停掉 session

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

二、createGlobalTempView使用

  • createGlobalTempView():创建全局临时视图。

这种视图的生命周期取决于spark application本身。如果想drop此视图可采用dropGlobalTempView删除

spark.catalog.dropGlobalTempView("tempViewName")

或者stop() 将停止

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

注: Spark 2.1.0版本中引入了Global temporary views 。

当您希望在不同sessions 之间共享数据并保持活动直到application结束时,此功能非常有用。

为了说明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()
  }
}

三、注册为临时表,参数为数据表名称

df.registerTempTable(“tableName”)

其生命周期只在所定义的sqlContext或hiveContext实例之中。换而言之,在一个sqlContext(或hiveContext)中registerTempTable的表不能在另一个sqlContext(或hiveContext)中使用。

    原文作者:今晚吃什么?
    原文地址: https://blog.csdn.net/qq_41927486/article/details/107900586
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞