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

    xiaoxiao2025-03-06  54

    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<Row> 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 进行查询 ? 还是我理解的生命周期有问题 ?

    更新中 …

    最新回复(0)