【问题分析】 - 关于SparkSession使用createOrReplaceTempView 和 createGlobalTempView 创建临时表的区别的分析

1.官方文档

  1. 之前在练习一些例子的时候看到官方文档对这二者的定义是这样的

createOrReplaceTempView 的作用是创建一个临时的表 , 一旦创建这个表的会话关闭 , 这个表>也会立马消失 其他的SparkSession 不能共享应已经创建的临时表

createGlobalTempView 创建一个全局的临时表 , 这个表的生命周期是 整个Spark应用程序 ,
只要Spark 应用程序不关闭 , 那么. 这个临时表依然是可以使用的 ,并且这个表对其他的SparkSession共享

测试代码


    public static void main(String[] args) throws AnalysisException {
        // 一定要加上 , 配置Master为本地
        SparkConf conf = new SparkConf()
                .setAppName("Sql")
                .setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(conf);
        // 设置输出日志等级
        sc.setLogLevel("WARN");

        // SparkSqlContext , HiveContext(Spark1.3以上建议用)
        // 1.创建一个SparkSession对象 , 类始于SparkContext
        SparkSession sparkSession = SparkSession
                .builder() // builder 是用来实例化一个SparkSession对象的
                .appName("SQL")
                .config("spark.some.config.option" , "some-value")
                .getOrCreate();

        // 第一个SparkSession 创建一个全局临时表
        Dataset df = sparkSession.read().json("SparkSql/src/main/resources/people.json");
        df.createGlobalTempView("people");
        // 会提示异常 : Table or view not found: `global_temp`.`people`; line 1 pos 17;
        df.createOrReplaceTempView("people");

        // 创建一个SparkSession02 因为创建的全局的临时视图 , 所以SparkSession02 也可以用 这个表
        SparkSession sparkSession02 = sparkSession.newSession();

        // 会报错 (No active SparkContext.) 原因可能是 SparkSession 内置的SparkContext也会被关闭
        //sparkSession.close();

        // 进行查询 共享临时表没问题
        sparkSession02.sql("select name from global_temp.people").show();

        sc.stop();
    }

测试结果

  • 当我 设置类全局的临时表 , 那么我在另外一个SparkSession 也可以执行 SparkSession.sql() 查询之前的SparkSession的表
  • 当我把创建全局临时表的SparkSession关闭后 , 原来的 就无法进行查询 报错的错误是
    会报错 (No active SparkContext.) 原因可能是 SparkSession 内置的SparkContext也会被关闭
  • 这里 如果创建的是临时表而不是全局的临时表 ,那么其他Session 也是没法用的
    会提示异常 : Table or view not found: global_temp.people; line 1 pos 17;

尚未搞明白的问题

所以现在没有搞明白的是 生命周期的问题 ,
全局临时表的生命周期的意思是不是 一个Session 关闭了 , 另外一个Session也能用 ? (我的理解)  
如何 在 将SparkSession 关闭的情况下 , 也可以使用其他的SparkSession 进行查询 ? 
还是我理解的生命周期有问题 ? 

更新中 …

你可能感兴趣的:(【问题分析】 - 关于SparkSession使用createOrReplaceTempView 和 createGlobalTempView 创建临时表的区别的分析)