Databricks中Pytest Fixture初始化SparkSession报错求助
解决Databricks中Pytest Fixture初始化SparkSession的"Master URL not set"问题
核心原因
在Databricks环境中,SparkSession是全局预初始化的,直接调用SparkSession.builder.getOrCreate()会尝试创建全新的本地Session(而非复用Databricks提供的集群Session),这就会触发"Master URL not set"错误。
正确的Fixture实现方式
修改Testcases/conftest.py中的SparkSession Fixture,直接复用Databricks已有的Session,而非通过Builder重新创建:
import pytest from pyspark.sql import SparkSession @pytest.fixture(scope="session", autouse=True) def spark(): # 优先获取Databricks预初始化的集群级SparkSession active_session = SparkSession.getActiveSession() if active_session: return active_session # 仅在本地调试(非Databricks集群)时兜底创建Session return SparkSession.builder.getOrCreate()
为什么这样有效?
SparkSession.getActiveSession()会直接返回Databricks环境中已存在的、配置完整的集群Session,自带正确的Master URL和集群资源配置。- 兜底的
getOrCreate()仅用于本地开发调试场景,保证Fixture在非Databricks环境下也能正常运行。
额外验证与注意事项
- Runner Notebook中调用pytest的示例代码(无需额外传递Spark配置):
import subprocess import sys # 切换到项目根目录执行pytest result = subprocess.run( [sys.executable, "-m", "pytest", "./Testcases", "-v"], capture_output=True, text=True ) print("测试输出:\n", result.stdout) if result.stderr: print("错误信息:\n", result.stderr) - 测试类中正确依赖Fixture的示例:
from Reusables.DataOperations import load_sample_data class TestDataValidation: def test_data_not_empty(self, spark): df = load_sample_data(spark, "/dbfs/path/to/test/data") assert df.count() > 0, "测试数据集为空" - 确保Databricks集群的Spark版本与本地开发环境(若有)一致,避免版本兼容性问题。
内容的提问来源于stack exchange,提问作者Sudhakar T
相关产品推荐
相关产品推荐

