将文件从Azure文件加载到Azure数据库
问题描述
正在寻找使用Azure Files SDK将文件上载到我的Azure数据库BLOB存储的方法
我使用这个page中的函数尝试了很多东西
但都没有奏效。我不明白为什么
示例:
file_service = FileService(account_name='MYSECRETNAME', account_key='mySECRETkey')
generator = file_service.list_directories_and_files('MYSECRETNAME/test') #listing file in folder /test, working well
for file_or_dir in generator:
print(file_or_dir.name)
file_service.get_file_to_path('MYSECRETNAME','test/tables/input/referentials/','test.xlsx','/dbfs/FileStore/test6.xlsx')
with est.xlsx=我的Azure文件中的文件名
/dBFS/FileStore/est6.xlsx=>在我的dBFS系统中上传文件的路径
我收到错误消息:
异常=指定的资源名称包含无效字符
尝试更改名称,但似乎不起作用
编辑:我甚至不确定该函数是否正在执行我想要的操作。从Azure文件加载文件的最佳方式是什么?
解决方案
根据我的经验,我认为从Azure文件加载文件的最佳方法是通过带有sas令牌的url直接读取文件。
例如,如下图所示,在我的test
文件共享中,我使用Azure存储资源管理器查看了名为test.xlsx
的文件,然后使用SAS令牌生成其URL。
图1.右击文件,然后单击Get Shared Access Signature...
图2.必须选择直接读取文件内容的Read
权限选项。
图3.复制带有SAS令牌的URL
这是我的示例代码,您可以使用Azure数据库中文件的SAS令牌URL运行它。
import pandas as pd
url_sas_token = 'https://<my account name>.file.core.windows.net/test/test.xlsx?st=2020-01-27T10%3A16%3A12Z&se=2020-01-28T10%3A16%3A12Z&sp=rl&sv=2018-03-28&sr=f&sig=XXXXXXXXXXXXXXXXX'
# Directly read the file content from its url with sas token to get a pandas dataframe
pdf = pd.read_excel(url_sas_token )
# Then, to convert the pandas dataframe to a PySpark dataframe in Azure Databricks
df = spark.createDataFrame(pdf)
或者,要使用Azure文件存储SDK为您的文件生成带有SAS令牌的URL或获取您的文件的字节数以供读取,请参阅官方文档Develop for Azure Files with Python
和我下面的示例代码。
# Create a client of Azure File Service as same as yours
from azure.storage.file import FileService
account_name = '<your account name>'
account_key = '<your account key>'
share_name = 'test'
directory_name = None
file_name = 'test.xlsx'
file_service = FileService(account_name=account_name, account_key=account_key)
生成文件的SAS标记URL
from azure.storage.file import FilePermissions
from datetime import datetime, timedelta
sas_token = file_service.generate_file_shared_access_signature(share_name, directory_name, file_name, permission=FilePermissions.READ, expiry=datetime.utcnow() + timedelta(hours=1))
url_sas_token = f"https://{account_name}.file.core.windows.net/{share_name}/{file_name}?{sas_token}"
import pandas as pd
pdf = pd.read_excel(url_sas_token)
df = spark.createDataFrame(pdf)
或使用get_file_to_stream
函数读取文件内容
from io import BytesIO
import pandas as pd
stream = BytesIO()
file_service.get_file_to_stream(share_name, directory_name, file_name, stream)
pdf = pd.read_excel(stream)
df = spark.createDataFrame(pdf)
相关文章