无法通过 SSMS 访问 Azure Synapse Spark 表

问题描述

我在通过 SSMS 连接到我的 Spark Pool 集群时遇到问题。 在 Synapse Studio 中,我正在执行以下步骤:

  1. 首先,我使用 sql 在 Apache Spark 集群上创建一个数据库: %%sql

创建数据库测试

  1. 接下来,我使用 pyspark 创建一个表,指向带有镶木地板文件的 ADLS2 文件夹: spark.sql("如果不存在则创建表 test.testparquet USING parquet LOCATION 'abfss://test@test.test.core.windows.net/test/output'")

  2. 数据库是通过 Synapse Studio 创建的,没有任何问题。

  3. 然后我去 SSMS 并将 ondemand sql 实例放入浏览器:

Azure Synapse On Demand SqlInstance

  1. 然后,当我去查询 spark 数据库和表时,出现以下错误

Credential Error

功能已使用数月,所以我不知道是什么原因导致了这种情况。 我试图通过在 spark 数据库中创建范围凭据来解决该问题,但是当我删除重新创建数据源时,出现以下错误

Msg 15875,Level 16,State 8,Line 2 不允许对复制数据库执行 DROP EXTERNAL DATA SOURCE 操作。 消息 102,级别 15,状态 1,第 6 行 'sqlondemand' 附近的语法不正确。

为什么我无法再通过 SSMS 访问我的 ADLS 2 parquet 文件

解决方法

您是使用 AAD 用户还是 SQL 用户连接?

使用 AAD 用户,将用户的身份传递到存储以读取数据。

使用 SQL 用户,您必须创建凭据才能读取数据表单存储。 SQL 用户的范围限定为 SQL 池,因此它无法在没有适当凭据的情况下访问存储。为此,请运行以下命令:

CREATE CREDENTIAL [https://<mystorageaccountname>.dfs.core.windows.net/<mystorageaccountcontainername>] WITH IDENTITY='SHARED ACCESS SIGNATURE',SECRET = 'YOUR_SECRET';
GRANT REFERENCES ON CREDENTIAL::[https://<mystorageaccountname>.dfs.core.windows.net/<mystorageaccountcontainername>] TO [specific_user];

对于 SQL 用户,当您将凭据命名为存储路径时,无服务器 SQL 池在查询湖中的数据时会自动使用它(只要用户有权使用它)。

我猜发生的情况是,您很久以前创建了凭据,但现在它已过期,因此您开始看到此错误消息。