使用 powershell 从 ADL Gen2 下载镶木地板文件

Download parquet file from ADL Gen2 using powershell

我正在使用下面的 powershell 命令将 TSV 文件从 ADL 下载到本地系统,它工作得很好

#this appid has access to ADL
[string] $AppID  = "bbb88818-aaaa-44fb-q2345678901y" 
 [string] $TenantId  = "ttt88888-xxxx-yyyy-q2345678901y"
 [string] $SubscriptionName  = "Sub Sample"
 [string] $AzureDataLakeAccountName  = "sample.blob.core.windows.net"

 [string] $AzureDataLakeSrcFilePath  = "/accounts/sample/test.tsv"
 [string] $LocalTargetFilePathName  = "D:\MoveToModern"


Write-Host "AppID = " $AppID
Write-Host "TenantId = " $TenantId
Write-Host "SubscriptionName = " $SubscriptionName
Write-Host "AzureDataLakeAccountName = " AzureDataLakeAccountName
Write-Host "AzureDataLakeSrcFilePath = " $AzureDataLakeSrcFilePath
Write-Host "LocalTargetFilePathName = " $LocalTargetFilePathName



#this is the access key of the appid
$AccessKeyValue = "1234567=u-r.testabcdefaORYsw5AN5"

$azurePassword    = ConvertTo-SecureString $AccessKeyValue -AsPlainText -Force
$psCred           = New-Object System.Management.Automation.PSCredential($AppID, $azurePassword)
Login-AzureRmAccount -Credential $psCred -ServicePrincipal -Tenant $TenantId

Get-AzureRmSubscription

Get-AzureRmSubscription -SubscriptionName $SubscriptionName  | Set-AzureRmContext
Export-AzureRmDataLakeStoreItem -AccountName $AzureDataLakeAccountName -Path $AzureDataLakeSrcFilePath  -Destination $LocalTargetFilePathName -Force

但是当我用值 /accounts/sample/test-V4.parquet 替换源文件路径时,出现以下错误:

ADLSException:获取路径 /accounts/Partner/Non-PII/Account/Account-V4.parquet 的元数据时出错。 操作:GETFILESTATUS 失败,出现 HttpStatus:Forbidden 错误:JSON 解析错误流时出现意外错误。 Content-Type 的错误响应:application/xml。 ExceptionType:Newtonsoft.Json.JsonReaderException ExceptionMessage:解析值时遇到意外字符:<。路径 '',第 0 行,位置 0。 AuthenticationFailed服务器未能验证请求。确保 Authorization header 的值格式正确,包括签名。 RequestId:de2e4b16-001e-002e-625f-c92785000000

能否告诉我如何使用 powershell 从 ADL Gen2 下载 parquet 文件。

根据您提供的信息,您没有足够的权限执行此操作。所以你得到 Forbidden 错误。如果要使用服务主体从 Azure 数据湖存储下载文件,我们需要授予安全主体对该文件的读取访问权限,并向安全主体授予对容器和文件夹层次结构中的每个文件夹的执行权限,从而导致文件。

例如

请检查并设置正确的ACL。具体操作方法请参考here


如果你想从 Azure Data Lake Gen2 下载文件,我建议你使用 PowerShell 模块 Az.Storage。详情请参考here

例如

  1. 为服务主体配置 ACL。

如果要使用服务主体从 Azure 数据湖 Gen2 下载文件,我们需要授予安全主体读取该文件的权限,并授予安全主体对容器和层次结构中每个文件夹的执行权限导致该文件的文件夹。具体如何配置请参考here.

  1. 脚本
$AppID  = "" 
$AccessKeyValue  = ""
$TenantId=""


$azurePassword    = ConvertTo-SecureString $AccessKeyValue -AsPlainText -Force
$psCred           = New-Object System.Management.Automation.PSCredential($AppID, $azurePassword)
Connect-AzAccount -Credential $psCred -ServicePrincipal -Tenant $TenantId


$AzureDataLakeAccountName  = ""
$ctx =New-AzStorageContext -StorageAccountName $AzureDataLakeAccountName -UseConnectedAccount 

$filesystemName="<your container name>"
$path="<your blob name>"
$LocalTargetFilePathName  = ""
Get-AzDataLakeGen2ItemContent -Context $ctx -FileSystem $filesystemName -Path $path -Destination $LocalTargetFilePathName