Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure函数Python写入Azure DataLake Gen2_Python_Azure Functions_Azure Data Lake Gen2 - Fatal编程技术网

Azure函数Python写入Azure DataLake Gen2

Azure函数Python写入Azure DataLake Gen2,python,azure-functions,azure-data-lake-gen2,Python,Azure Functions,Azure Data Lake Gen2,我想用Azure函数和Python向我的Azure DataLake Gen2写入一个文件 很遗憾,我遇到了以下身份验证问题: 异常:ClientAuthenticationError:(InvalidAuthenticationInfo) 服务器无法对请求进行身份验证。请参阅 www认证标头中的信息 “WWW验证”:“已编辑” 我的帐户和功能应用程序都应该具有访问我分配的DataLake所需的角色 这是我的功能: import datetime import logging from azu

我想用Azure函数和Python向我的Azure DataLake Gen2写入一个文件

很遗憾,我遇到了以下身份验证问题:

异常:ClientAuthenticationError:(InvalidAuthenticationInfo) 服务器无法对请求进行身份验证。请参阅 www认证标头中的信息

“WWW验证”:“已编辑”

我的帐户和功能应用程序都应该具有访问我分配的DataLake所需的角色

这是我的功能:

import datetime
import logging

from azure.identity import DefaultAzureCredential
from azure.storage.filedatalake import DataLakeServiceClient
import azure.functions as func

def main(mytimer: func.TimerRequest) -> None:
    utc_timestamp = datetime.datetime.utcnow().replace(
        tzinfo=datetime.timezone.utc).isoformat()

    if mytimer.past_due:
        logging.info('The timer is past due!')

    credential = DefaultAzureCredential()
    service_client = DataLakeServiceClient(account_url="https://<datalake_name>.dfs.core.windows.net", credential=credential)

    file_system_client = service_client.get_file_system_client(file_system="temp")
    directory_client = file_system_client.get_directory_client("test")
    file_client = directory_client.create_file("uploaded-file.txt")
    
    file_contents = 'some data'
    file_client.append_data(data=file_contents, offset=0, length=len(file_contents))
    file_client.flush_data(len(file_contents))


    logging.info('Python timer trigger function ran at %s', utc_timestamp)
导入日期时间
导入日志记录
从azure.identity导入DefaultAzureCredential
从azure.storage.filedatalake导入DataLakeService客户端
将azure.1函数导入为func
def main(mytimer:func.TimerRequest)->无:
utc_timestamp=datetime.datetime.utcnow().replace(
tzinfo=datetime.timezone.utc).isoformat()
如果mytimer.pass_到期:
logging.info('计时器过期!')
凭证=DefaultAzureCredential()
服务\u客户端=DataLakeServiceClient(帐户\u url=”https://.dfs.core.windows.net,凭证=凭证)
文件系统客户端=服务客户端。获取文件系统客户端(文件系统=“temp”)
目录客户端=文件系统客户端。获取目录客户端(“测试”)
file_client=目录_client.create_文件(“upload file.txt”)
文件内容='一些数据'
文件\客户端。追加\数据(数据=文件\内容,偏移量=0,长度=长度(文件\内容))
文件\u客户端。刷新\u数据(len(文件内容))
logging.info('Python计时器触发器函数在%s运行,utc\u时间戳)
我错过了什么

THX&BR


Peter

问题似乎来自DefaultAzureCredential

DefaultAzureCredential使用的标识取决于环境。当需要访问令牌时,它会依次使用这些身份向用户发出请求,并在用户提供令牌时停止:

1. A service principal configured by environment variables. 
2. An Azure managed identity. 
3. On Windows only: a user who has signed in with a Microsoft application, such as Visual Studio.
4. The user currently signed in to Visual Studio Code.
5. The identity currently logged in to the Azure CLI.
事实上,您可以完全生成datalake服务对象,而无需使用默认凭据。可以执行此操作(使用连接字符串直接连接):


此外,为了确保数据写入的顺畅,请检查您的datalake是否有访问限制。

Bowman Zhu建议的函数包含错误。根据参数“length”预期的长度为字节。但是,建议的函数使用字符长度。其中一些字符可能由多个字节组成。在这种情况下,函数不会将文件内容的所有字节写入文件,从而导致数据丢失

所以,

file_client.append_data(data=file_contents, offset=0, length=len(file_contents))
file_client.flush_data(len(file_contents))
必须是这样的:

length = len(file_contents.encode())
file_client.append_data(data=file_contents, offset=0, length=length)
file_client.flush_data(offset=length)

在我这方面似乎效果不错。你是在本地还是在azure上进行测试?我已经测试过了,本地和azure都失败了。直接使用连接字符串怎么样?@BowmanZhu:将DefaultAzureCredential()的结果传递给DataLakeServiceClient对你来说是可行的?DefaultAzureCredential在您这边使用了哪个标识-VScode、CLI、…?由于安全原因,连接字符串不幸被禁用。我的问题是,由于安全原因,Datalake的连接字符串被禁用。DefaultAzureCredential正在使用我的CLI标识,该标识对DataLake具有足够的权限。@好的,明天我将尝试复制相同的问题,现在有一些事情要做。谢谢你的回复。:)那太棒了,非常感谢!但我在AzureCliCredential()方面取得了成功,由于这一事实,现在似乎是Azure中的角色分配问题,我将接受您的答案。再次感谢您的努力!BR Peteryes,它确实在本地与AzureCliCredential()一起工作
length = len(file_contents.encode())
file_client.append_data(data=file_contents, offset=0, length=length)
file_client.flush_data(offset=length)