全局临时视图生命周期绑定于spark application而非session;需用global_temp.前缀访问,spark connect等无服务器环境不支持,application终止后视图即消失。

global_temp 视图不会在 Session 关闭后消失——这是常见误解。真正的情况是:全局临时视图生命周期与 Spark Application 绑定,而非单个 Session;只要 Application 还在运行,global_temp 中的视图就一直存在,且可在任意新创建的 SparkSession(包括 spark.newSession())中访问。
但你看到“消失”,大概率是因为以下真实原因:
全局临时视图必须用 global_temp. 前缀显式引用
- 错误写法:
SELECT * FROM people(即使你调用了createGlobalTempView("people")) - 正确写法:
SELECT * FROM global_temp.people - 即使在同一个 Session 内,漏掉
global_temp.就会报错Table or view not found: people -
USE global_temp后可省略前缀,但该语句只影响当前 Session 的默认数据库,不改变视图本身的存在性
Spark Connect 或无服务器环境不支持全局临时视图
- Databricks 无服务器计算、Spark Connect 等托管环境明确声明:
createGlobalTempView和createOrReplaceGlobalTempView被禁用 - 尝试调用会静默失败或抛出未文档化的异常(不是
TempTableAlreadyExistsException) - 此时即使代码没报错,视图也根本没注册成功
Application 实际已终止,但你以为还在
- 本地模式下:JVM 进程退出 → Application 结束 →
global_temp清空 - YARN/Cluster 模式下:Driver 进程崩溃、超时退出、
spark.stop()被调用 → 所有全局视图立即失效 - 注意:
spark.newSession()创建的是新 Session,但共享同一 Application 上下文;而重启整个应用(比如重新运行脚本、Notebook kernel restart)就是全新 Application
为什么不能跨 Application 存在?
-
global_temp是 Spark 内存中维护的元数据映射(ConcurrentHashMap),非持久化存储 - 它不写入 Hive Metastore,也不依赖外部 catalog(如 Unity Catalog)
- 所以无法像普通表那样被其他 Application 发现或复用
最容易被忽略的是:你在 Notebook 中反复运行 cell,却没意识到 kernel 已重启 —— 那一刻 global_temp 就真的从内存里蒸发了,连 SHOW TABLES IN global_temp 都查不到任何东西。











