Azure Databricks免费试用:保存DataFrame到ADLS Gen2报错求助
解决方案
1. 修复外部位置创建的语法错误
你之前的CREATE EXTERNAL LOCATION语法不符合Azure Databricks规范,必须先创建独立的外部凭证,再在外部位置中引用该凭证,不能直接内嵌存储密钥。执行以下SQL:
第一步:创建外部凭证
CREATE EXTERNAL CREDENTIAL IF NOT EXISTS silver_storage_cred WITH IDENTITY = 'storage_account_key', SECRET = 'GlGLL4o2tXZUawz0CqVgguhKGsAN2YLQRIUs56yw8PHTw8zYQIWc2+gWFojXFWWo/puH/Q2e/t6B+AStOAyWig==';
第二步:创建覆盖目标父路径的外部位置
你的写入路径是abfss://silver@careerit.dfs.core.windows.net/retailfiles/orderItems,外部位置需要覆盖它的父路径retailfiles/,确保写入路径在外部位置的权限范围内:
CREATE EXTERNAL LOCATION IF NOT EXISTS silver_retail_location URL 'abfss://silver@careerit.dfs.core.windows.net/retailfiles/' WITH (CREDENTIAL = silver_storage_cred);
2. 关联数据库到外部位置(推荐)
创建数据库时指定LOCATION为外部位置的URL,后续表会默认存储在该位置,避免路径权限冲突:
spark.sql("CREATE DATABASE IF NOT EXISTS retail LOCATION 'abfss://silver@careerit.dfs.core.windows.net/retailfiles/'")
3. 调整DataFrame写入逻辑
如果已关联数据库到外部位置,无需单独指定path参数,Databricks会自动使用数据库的存储位置;若需指定路径,确保它是外部位置URL的子路径:
DForderItems.write \ .option("mergeSchema", True) \ .mode("append") \ .saveAsTable("retail.orderItems")
4. 免费试用环境权限验证
- 确认你的Azure账户对
careerit存储账户的silver容器拥有存储Blob数据参与者权限。 - 检查存储账户防火墙设置:若为公共网络访问,需允许所有网络;若为私有网络,需配置Databricks工作区的访问端点。
排查要点
- 核对外部位置URL与写入路径的父路径是否完全匹配(ADLS Gen2路径区分大小写)。
- 确认外部凭证的存储密钥无复制错误或过期。
内容的提问来源于stack exchange,提问作者azuredataengineer89
相关产品推荐
相关产品推荐

