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();
}
(No active SparkContext.)
原因可能是 SparkSession 内置的SparkContext也会被关闭Table or view not found: global_temp.people; line 1 pos 17;
所以现在没有搞明白的是 生命周期的问题 ,
全局临时表的生命周期的意思是不是 一个Session 关闭了 , 另外一个Session也能用 ? (我的理解)
如何 在 将SparkSession 关闭的情况下 , 也可以使用其他的SparkSession 进行查询 ?
还是我理解的生命周期有问题 ?