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