Problem:
Masz dostępne Databricks, Pythona i Azure Storage Account. Potrzebujesz pobrać raport Power BI umieszczony na Azure Storage account przy pomocy Pythona.
Potem ten plik należy opublikować w serwisie Power BI.
Nie możesz tego zrobić przy użyciu Sparka, albo Pandas. To się nie uda i jednocześnie, to nie jest to zadanie.
Możesz instalować bilbioteki na clustrze. Najlepiej, żeby ich autorem był Microsoft.
Rozwiązanie:
Microsoft udostępnia bibliotekę: azure.storage.filedatalake przy pomocy której można przeczytać plik z landing zone w formacie binarnym a potem opublikować go w portalu Power BI.
Wystarczy z kontenera przeczytać plik:
file_content = file_container.download_file()
A potem opublikować go w Power BI portalu:
publish_powerbi_report(PBI_WORKSPACE_ID, PBI_REPORT_NAME, file_content)
Authentykacja i łączenie z Azure Storage account
Zacznijmy od autentykacji. Będziesz potrzebował:
- Tenant Id
- Service principala
- Sekretów w Key Vault
- Biblioteki azure.identity
from azure.identity import ClientSecretCredential
client_id = dbutils.secrets.get(scope = KEY_VAULT_SECRET_SCOPE, key = 'sp-next-level-appid')
client_secret = dbutils.secrets.get(scope = KEY_VAULT_SECRET_SCOPE, key = 'sp-next-level-secret')
credential = ClientSecretCredential(TENANT_ID,client_id,client_secret)
OK, mamy stworzone credentiale, teraz pora na połączenie ze Storage Account. Do tego potrzebne będzie
- Azure Storage Account. 😉
- Biblioteki azure.storage.filedatalake
- Kontenera, gdzie będą przechowywane pliki (to będzie potrzebne w następnym kroku)
from azure.storage.filedatalake import DataLakeServiceClient
datalake_service_client = DataLakeServiceClient(account_url=f"https://{AZURE_STORAGE_ACCOUNT_NAME}.dfs.core.windows.net/",credential=credential)
Wczytywanie raportu Power BI z Azure Storge Account
Najpierw przy użyciu data lake service client stworzymy file system client, wskazująć na kontener w którym zaczynamy poszukiwania pliku. Jeżeli dokładnie wiesz jak plik będzie się nazywał wtedy możesz pominąć ten krok i zrobić to inaczej.
W moim przypadku nazwa pliku jest co tydzień inna.
fsc = datalake_service_client.get_file_system_client(AZURE_STORAGE_CONTAINER)
Poszukajmy pliku zakończonego na .pbix
for path in fsc.get_paths():
if '.pbix' in path.name:
Gdy go znajdziemy pobierzemy go w formacie binarnym. Dzięki tej bibliotece to proste:
fc = fsc.get_file_client(path.name)
file_content = fc.download_file()
Publikowanie raportu i uwagi końcowe
Teraz pozostało już tylko opublikować raport:
publish_powerbi_report(PBI_WORKSPACE_ID, PBI_REPORT_NAME, file_content)
Dzięki tej bibliotece nie ma potrzeby zapisywać plików na lokalny file system clustra. Operacje wykonywane są "w pamięci".
Jak zerkniesz trochę niżej, w jaki sposób działa metoda download_file, to zobaczysz, że wykorzystywany jest BlobClient:
downloader = self._blob_client.download_blob(offset=offset, length=length, **kwargs)
return StorageStreamDownloader(downloader)
O pobieraniu plików binarnych w środowisku Databricks przy użyciu Pythona było też w tym wpisie:
https://nextlevelbi.pl/jak-pobrac-pliki-binarne-z-azure-storage-account-pythona/
Cały kod dostępny jak zawsze w github:
https://github.com/rgogloza/nextlevelbi/blob/master/databricks/utils-pbi-publish-report-v2.ipynb
Link do dokumentacji:
https://learn.microsoft.com/en-us/azure/storage/blobs/data-lake-storage-directory-file-acl-python?tabs=azure-ad