从Databricks连接Cosmos DB报错:Catalog 'cosmoscatalog'未找到
我已完全遵循文档操作,尝试从Databricks连接Cosmos DB以写入数据。Databricks集群运行时版本为11.3 LTS,已安装Cosmos DB Spark连接器:com.azure.cosmos.spark:azure-cosmos-spark_3-3_2-12:4.15.0。配置代码如下:
cosmosEndpoint = "MyEndpoint" cosmosMasterKey = "MyMasterKey" cosmosDatabaseName = "SampleDB" cosmosContainerName = "testContainer" #Configure Catalog Api to be used spark.conf.set("spark.sql.catalog.cosmosCatalog", "com.azure.cosmos.spark.CosmosCatalog") spark.conf.set("spark.sql.catalog.cosmosCatalog.spark.cosmos.accountEndpoint", cosmosEndpoint) spark.conf.set("spark.sql.catalog.cosmosCatalog.spark.cosmos.accountKey", cosmosMasterKey) #create an Azure Cosmos DB database using catalog api spark.sql("CREATE DATABASE IF NOT EXISTS cosmosCatalog.{};".format(cosmosDatabaseName)) #create an Azure Cosmos DB container using catalog api spark.sql("CREATE TABLE IF NOT EXISTS cosmosCatalog.{}.{} using cosmos.oltp TBLPROPERTIES(partitionKeyPath = '/id', manualThroughput = '1100')".format(cosmosDatabaseName, cosmosContainerName))
执行时出现错误:AnalysisException: Catalog 'cosmoscatalog' not found,请问该错误产生的原因是什么?
标识符大小写敏感问题:Spark SQL默认对catalog名称大小写敏感,你配置的catalog名称是驼峰式的
cosmosCatalog,但报错中显示的是全小写的cosmoscatalog。部分Databricks环境会自动将SQL中的标识符转换为小写,导致无法匹配驼峰命名的catalog。可以尝试将配置中的catalog名称改为全小写cosmoscatalog,或者在SQL中用反引号包裹cosmosCatalog来保留大小写,比如CREATE DATABASE IF NOT EXISTScosmosCatalog.${databaseName}。配置未及时生效:
spark.conf.set设置的catalog配置需要在Spark会话初始化阶段加载。如果是在Notebook运行过程中动态设置这些配置,可能无法正确初始化CosmosCatalog类,导致catalog未被注册。建议将这些配置添加到集群的Spark配置中(集群启动时设置),或者重启Notebook会话后再执行代码。连接器类加载异常:尽管
azure-cosmos-spark_3-3_2-12:4.15.0理论上适配Spark 3.3.x(对应Databricks 11.3 LTS),但如果安装过程中出现依赖缺失或类加载失败,会导致CosmosCatalog无法被实例化。可以查看集群日志,确认是否存在类找不到的报错信息。配置参数拼写错误:核对
spark.sql.catalog.cosmosCatalog对应的类路径com.azure.cosmos.spark.CosmosCatalog是否正确,确保没有拼写错误(比如包名或类名写错),否则Spark无法找到对应的Catalog实现类完成注册。
内容的提问来源于stack exchange,提问作者Nonya

