静态集群中同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自然无法访问。
解决办法
如果需要在任务间共享数据,不要用全局临时视图,改用以下方案:
- 写入持久化存储:把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") - 使用集群级临时表:将数据注册为集群级临时表,它可以在同一集群的不同SparkSession中访问,直到集群终止才会被删除。示例:
# 创建集群级临时表 transactions.createOrReplaceTempView("transactions") # 后续任务直接读取(同一集群内有效) transactions = session.sql("SELECT * FROM transactions")
内容的提问来源于stack exchange,提问作者Average_guy
相关产品推荐
相关产品推荐

