По моему опыту, я думаю, что лучший способ загрузить файл из Azure Файлы - это напрямую прочитать файл через его URL с токеном sas.
Например, как показано на рисунках ниже, это файл с именем test.xlsx
в моей общей папке test
, которую я просмотрел с помощью Azure Storage Explorer, а затем сгенерировал ее URL с токеном sas.
Рис. 1. Щелкните правой кнопкой мыши файл и затем щелкните Get Shared Access Signature...
Рис 2. Необходимо выбрать опцию Read
разрешение для непосредственного чтения содержимого файла.
Рис. 3. Скопируйте URL с токеном sas
Вот мой пример кода, вы можете запустите его с URL-адресом sas-токена вашего файла в Azure Databricks.
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 File Storage SDK для создания URL-адреса с sas-токеном для вашего файла или для получения байты вашего файла для чтения, пожалуйста, обратитесь к официальному документу 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)
To создать URL-адрес токена sas файла
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)