首页 > 解决方案 > 使用 powershell 从 ADL Gen2 下载镶木地板文件

问题描述

我正在使用以下 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 解析中出现意外错误。错误响应的内容类型:application/xml。ExceptionType:Newtonsoft.Json.JsonReaderException ExceptionMessage:解析值时遇到意外字符:<。路径 '',第 0 行,位置 0。 AuthenticationFailed服务器未能验证请求。确保 Authorization 标头的值正确形成,包括签名。请求ID:de2e4b16-001e-002e-625f-c92785000000

在此处输入图像描述

您能否告诉我如何使用 powershell 从 ADL Gen2 下载镶木地板文件。

标签: azureparquetazure-powershell

解决方案


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

例如 在此处输入图像描述

请检查并设置正确的 ACL。关于如何做到这一点,请参考这里


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

例如

  1. 为服务主体配置 ACL。

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

  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 

推荐阅读