如何在Databricks R Notebook中同时使用多个Spark连接?
解决Databricks R Notebook中跨数据库表访问的问题
你的代码出错主要有两个原因:一是变量名误用,二是没必要创建多个Spark连接(反而会导致上下文混乱)。以下是具体修正方案:
问题根源
- 变量名错误:你定义了
sc_one和sc_two,但调用spark_read_table时用了未定义的sc,这会直接导致找不到对应连接的表。 - 多连接冗余且冲突:在Databricks中,
spark_connect(method="databricks")并非创建新会话,而是获取Notebook已绑定的默认Spark会话。多次调用会返回同一个实例,所以sc_one和sc_two本质是同一个对象——切换第二个数据库后,第一个数据库的上下文被覆盖,读取第一个表时自然找不到对应库的表。
正确实现方式
方式一:直接指定数据库+表名(推荐)
无需切换数据库,直接通过数据库名.表名的格式读取不同库的表,用单个Spark会话即可完成:
# 获取Databricks默认Spark会话 sc <- spark_connect(method = "databricks") # 直接读取不同数据库的表 first_var <- spark_read_table(sc, "first_database_name.first_table_name") second_var <- spark_read_table(sc, "second_database_name.second_table_name")
方式二:切换数据库(不推荐,仅作参考)
如果一定要通过切换数据库的方式读取,确保只用单个连接,且每次读取前切换到对应库:
sc <- spark_connect(method = "databricks") # 切换到第一个数据库并读取表 tbl_change_db(sc, "first_database_name") first_var <- spark_read_table(sc, "first_table_name") # 切换到第二个数据库并读取表 tbl_change_db(sc, "second_database_name") second_var <- spark_read_table(sc, "second_table_name")
关键提醒
在Databricks Notebook中,永远不要创建多个Spark连接——Notebook本身已绑定一个会话,多连接不仅冗余,还会导致上下文覆盖、表找不到等问题。直接用数据库名.表名跨库访问是最简洁可靠的方案。
内容的提问来源于stack exchange,提问作者Sanchez333
相关产品推荐
相关产品推荐

