You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

静态集群中同SparkSession下GlobalTempView无法读取问题排查

问题描述

我在deployment.yaml文件中定义了如下静态集群配置:

custom:
  basic-cluster-props: &basic-cluster-props
    spark_version: "11.2.x-scala2.12"

  basic-static-cluster: &basic-static-cluster
    new_cluster:
      <<: *basic-cluster-props
      num_workers: 1
      node_type_id: "Standard_DS3_v2"

所有任务均使用该集群配置。在某一任务中,我通过以下代码将DataFrame保存为全局临时视图:

transactions.createOrReplaceGlobalTempView("transactions")

在依赖该任务的另一个任务中,我尝试读取该临时视图:

global_temp_db = session.conf.get("spark.sql.globalTempDatabase")

# Load wallet features
transactions = session.sql(f"""SELECT *
                               FROM """ + global_temp_db + ".transactions"""
)

但出现错误:

AnalysisException: Table or view not found: global_temp.transactions; line 2 pos 43;
'Project [*]
+- 'UnresolvedRelation [global_temp, transactions], [], false

两个任务运行在同一个SparkSession中,为何找不到全局临时视图?

原因与解决方案

核心原因

你混淆了「同一集群」和「同一SparkSession」的关系:

  • 全局临时视图的生命周期完全绑定到创建它的SparkSession实例,而非集群本身。
  • Databricks中每个任务(Job)会启动独立的SparkSession,哪怕它们运行在同一个静态集群上。前一个任务结束后,对应的SparkSession会被销毁,其创建的全局临时视图也会随之消失,后续任务的新SparkSession自然无法访问。

解决办法

如果需要在任务间共享数据,不要用全局临时视图,改用以下方案:

  1. 写入持久化存储:把DataFrame保存为Parquet、Delta Lake等格式,后续任务直接读取存储路径的文件。示例:
    # 写入Delta Lake(推荐)
    transactions.write.format("delta").mode("overwrite").save("/dbfs/path/to/transactions")
    
    # 后续任务读取
    transactions = session.read.format("delta").load("/dbfs/path/to/transactions")
    
  2. 使用集群级临时表:将数据注册为集群级临时表,它可以在同一集群的不同SparkSession中访问,直到集群终止才会被删除。示例:
    # 创建集群级临时表
    transactions.createOrReplaceTempView("transactions")
    
    # 后续任务直接读取(同一集群内有效)
    transactions = session.sql("SELECT * FROM transactions")
    

内容的提问来源于stack exchange,提问作者Average_guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:20:38