我正在尝试通过Polybase从Azure SQLDW连接到Data Lake Gen 2中的Parquet文件。这是我的代码:
CREATE DATABASE SCOPED CREDENTIAL DSC_ServicePrincipal
WITH IDENTITY = '1234567890@https://login.microsoftonline.com/1234567890/oauth2/token',
SECRET = '1234567890'
GO
CREATE EXTERNAL DATA SOURCE [DS_ADLS] WITH (TYPE = HADOOP,
LOCATION = N'abfss://filesystem@storageacc.dfs.core.windows.net',
CREDENTIAL = DSC_ServicePrincipal)
GO
CREATE EXTERNAL FILE FORMAT [ParquetFileFormatSnappy]
WITH (FORMAT_TYPE = PARQUET, DATA_COMPRESSION = N'org.apache.hadoop.io.compress.SnappyCodec')
GO
CREATE EXTERNAL TABLE [dbo].[DimDate]
(
[DateSKey] int not null,
[Date] date not null,
[Year] int not null,
[Month] int not null,
[Day] int not null,
[WeekOfYear] int not null,
[MonthNameShort] varchar(50) not null,
[MonthName] varchar(50) not null,
[DayNameShort] varchar(50) not null,
[DayName] varchar(50) not null
)
WITH (DATA_SOURCE = [DS_ADLS],LOCATION = N'/PRESENTED/dimDate',FILE_FORMAT = [ParquetFileFormatSnappy],REJECT_TYPE = VALUE,REJECT_VALUE = 0)
创建外部表无法执行,并返回以下错误:
访问HDFS时发生错误:调用时引发Java异常 HdfsBridge_IsDirExist。 Java异常消息:HdfsBridge :: isDirExist -检查directoy是否存在时遇到意外错误:AbfsRestOperationException:HEAD https://xxxx.dfs.core.windows.net/xxxx?resource=filesystem&timeout=90 StatusCode = 403 StatusDescription =服务器无法通过身份验证 请求。确保形成了Authorization标头的值 正确包含签名。 ErrorCode = ErrorMessage =
该目录确实存在,并且我的服务主体可以访问。我已经通过使用Databricks的相同服务主体并正确读取文件来确认了这一点。
我不知道自己做错了什么。
答案 0 :(得分:1)
问题是abfs / abfss当前不支持用户提供的oauth凭据。
支持的身份验证方法是:
答案 1 :(得分:0)
顺便说一句 - Oauth2.0 is supported now on Gen2 。 如果您已验证路径和权限是否正确,即通过 Azure Databricks,我会怀疑它的网络相关。尝试使用网络设置不受限制的存储帐户进行确认。
由于启用了存储 FW,您可能会收到此错误 - 查看 docs here,您可以看到表示使用各种权限类型的 FW 限制的星号。 对于复制,您可以参考此authorisation table。
通常您可以在存储网络中“允许受信任的微软服务”,但这仅在使用 MSI 时有效 - 在您的情况下,您使用的是 SPN。
如果您仍然想使用服务主体或用户身份(而不是 MSI)查询您的数据湖,您可以尝试按照 steps here via powershell 操作,这将允许 Synapse 专用池(以前称为 SQLDW)传递存储 FW ,然后切换到 SPN 或 UPN 以针对 POSIX ACL 进行授权。
最后,这里有一篇很好的博客文章,讨论了 different options。