Databricks基于ADLS外部数据创建分区表后查询无结果及MSCK报错问题
问题解决方法
1. 排查ADLS存储账户认证配置错误
错误提示明确指向fs.azure.account.key配置无效,需从以下方面检查:
- 验证账户密钥配置:在Databricks集群的Spark配置中,确认
fs.azure.account.key.<存储账户名>.dfs.core.windows.net的配置值是存储账户的有效访问密钥,无拼写错误、多余空格或转义问题。可通过以下语句临时设置测试:spark.conf.set("fs.azure.account.key.yourstorageaccount.dfs.core.windows.net", "your-valid-access-key") - 改用托管标识认证(推荐):如果使用账户密钥容易出错,建议切换为托管标识。给Databricks工作区的托管标识分配ADLS存储账户的「存储Blob数据参与者」角色,然后配置Spark参数:
spark.conf.set("fs.azure.account.auth.type.yourstorageaccount.dfs.core.windows.net", "OAuth") spark.conf.set("fs.azure.account.oauth.provider.type.yourstorageaccount.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.MsiTokenProvider")
2. 确认外部表LOCATION路径正确性
检查创建表语句中LOCATION参数替换后的路径是否准确,需指向ADLS中的bronze根目录,格式应为:
abfss://bronze@yourstorageaccount.dfs.core.windows.net/
可通过dbutils.fs.ls("abfss://bronze@yourstorageaccount.dfs.core.windows.net/")验证目录是否可访问,分区目录是否存在。
3. 替代MSCK的分区注册方法
若MSCK因认证问题无法执行,可手动添加分区:
ALTER TABLE externaldata.table__bronze__websites_test2 ADD PARTITION (__run_date__='2023-10-23') LOCATION 'abfss://bronze@yourstorageaccount.dfs.core.windows.net/__run_date__=2023-10-23'; ALTER TABLE externaldata.table__bronze__websites_test2 ADD PARTITION (__run_date__='2023-10-30') LOCATION 'abfss://bronze@yourstorageaccount.dfs.core.windows.net/__run_date__=2023-10-30';
添加完成后执行REFRESH TABLE externaldata.table__bronze__websites_test2刷新元数据,再查询表数据。
4. 验证文件格式匹配性
确认CSV文件的分隔符与表定义中的delimiter=";"一致,可通过读取单个文件测试:
spark.read.option("header", "true").option("delimiter", ";").csv("abfss://bronze@yourstorageaccount.dfs.core.windows.net/__run_date__=2023-10-23/file__2023-10-23.csv").show()
若能正常读取数据,说明格式匹配,否则需调整表的OPTIONS参数或文件格式。
内容的提问来源于stack exchange,提问作者yash394
相关产品推荐
相关产品推荐

