尝试在Azure Synapse中读取链接存储上的Parcquet文件

问题描述

我正在尝试访问Gen2 Data Lake容器上的镶木地板文件。我在容器上拥有所有者RBAC,但希望限制其他用户对容器的访问。

我的查询非常简单:

    SELECT
    TOP 100 *
FROM
    OPENROWSET(
        BULK 'https://aztsworddataaipocacldl.dfs.core.windows.net/pocacl/Top/Sub/part-00006-c62926ba-c530-4ad8-87d1-cf38c67a2da3-c000.snappy.parquet',FORMAT='PARQUET'
    ) AS [result]

运行此程序时,连接没有问题。我试图将ACL权限添加文件(当然还包含文件夹“ Top”和“ Sub”)。

I've give RWX on the 'Top' folder using Storage Explorer and default so that it cascades to the 'Sub' folder and parquet files as I add them

当我的同事尝试运行sql脚本时,得到错误消息。 Failed to execute query. Error: File 'https://aztsworddataaipocacldl.dfs.core.windows.net/pocacl/Top/Sub/part-00006-c62926ba-c530-4ad8-87d1-cf38c67a2da3-c000.snappy.parquet' cannot be opened because it does not exist or it is used by another process. Spark也有类似的结果,但使用403代替

sql按需提供了错误发生后指向following help file链接,它表明:

如果查询失败,并显示文件无法打开,因为它不存在或被另一个进程使用,则无法打开”的错误,并且您确定两个文件都存在且未被另一个进程使用,则表示sql按需无法访问该文件 通常会发生此问题,因为您的Azure Active Directory身份无权访问该文件认情况下,sql按需尝试使用您的Azure Active Directory身份访问文件。要解决此问题,您需要具有访问文件的适当权限。 最简单的方法是在您要查询的存储帐户上为自己授予“ Storage Blob数据贡献者”角色。 >

我不希望授予Storage Blob数据贡献者或Storage Blob数据读取器,因为它可以访问容器上的每个文件,而不仅仅是我希望最终用户能够查询文件。我们发现SSMS连接到实木复合地板外部桌子时也会遇到同样的情况。

所以分部分:

  1. 这是使用ACL授予访问权限的正确模式,还是应该使用其他方法
  2. 我应该启用存储帐户或我的查询/笔记本中的设置以支持ACL吗?*
  3. 鉴于我们仍处于预览状态,到目前为止,是否已在Synapse Workspace上实施了ACL?

*我一直拒绝粘贴我的整个设置,因为我真的不知道什么与该问题相关,什么完全不相关,但是当然可以提供。

解决方法

在 Azure Synapse Analytics 预览版中,ACL 功能似乎无法正常工作。

我现在已经设法让它工作了。目前我看到,一旦 Read|Execute 被提供给一个文件夹,它就允许访问该文件夹和子文件夹中包含的文件。即使没有对子文件夹中的文件提供特定的 ACL 访问权限,也可以访问。这不是我所期望的,但它足以让我继续:仅授予对 Gold 文件夹的访问权限,就可以将我想让用户查询的文件和我想隐藏的工作文件的访问分开。>

,

将ACL分配给文件夹时,它不会递归传播到该文件夹​​内的所有文件。仅新文件从文件夹继承。

您可以看到此here