Мы пытаемся использовать пакет powerbiclient
внутри записной книжки Azure Databricks, чтобы получить информацию об отчетах, но получаем ошибку Exception: Power BI report is not embedded
.
Вместо этого тот же код работает, если мы используем его локально в коде Visual Studio.
Вот код, который мы используем:
!pip install powerbiclient==3.1.1
dbutils.library.restartPython()
from powerbiclient import Report, models
from io import StringIO
from ipywidgets import interact
import requests
import json
Мы попробовали как аутентификацию через вход по коду устройства, так и через принципала службы, но нам нужно придерживаться второго варианта:
# # option 1
# from powerbiclient.authentication import DeviceCodeLoginAuthentication
# device_auth = DeviceCodeLoginAuthentication()
# option 2
def azuread_auth(tenant_id: str, client_id: str, client_secret: str, resource_url: str):
"""
Authenticates Service Principal to the provided Resource URL, and returns the OAuth Access Token
"""
url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/token"
payload = f'grant_type=client_credentials&client_id = {client_id}&client_secret = {client_secret}&resource = {resource_url}'
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
response = requests.request("POST", url, headers=headers, data=payload)
access_token = json.loads(response.text)['access_token']
return access_token
tenant_id = 'XXX'
client_id = 'YYY
client_secret = 'ZZZ'
scope = 'https://analysis.windows.net/powerbi/api/.default'
resource_url = 'https://analysis.windows.net/powerbi/api'
token = azuread_auth(tenant_id, client_id, client_secret, resource_url)
И затем вызываем отчет:
group_id = '123-456'
dataset_id = 'abc-def'
report_id = '7g8-h9i'
report = Report(group_id=group_id, report_id=report_id, auth=token)
Но мы видим, что он не встроен:
print(report._embedded)
# False
Если мы попытаемся отобразить отчет, мы ничего не получим:
def loaded_callback(event_details):
print('Report is loaded')
report.on('loaded', loaded_callback)
def rendered_callback(event_details):
print('Report is rendered')
report.on('rendered', rendered_callback)
report.set_size(200, 300)
report
И если мы попытаемся получить страницы, мы получим вышеупомянутую ошибку:
pages = report.get_pages()
Exception Traceback (most recent call last)
File <command-2809091020085831>, line 3
1 report_dict = {}
2 # Get list of pages
----> 3 pages = report.get_pages()
4 for page in pages:
5 report.set_active_page(page['name'])
File /local_disk0/.ephemeral_nfs/envs/pythonEnv-48b6b502-a176-4d52-a15d-9ed2a921ac04/lib/python3.11/site-packages/powerbiclient/report.py:566, in Report.get_pages(self)
560 """Returns pages list of the embedded Power BI report
561
562 Returns:
563 list: list of pages
564 """
565 if not self._embedded:
--> 566 raise Exception(self.REPORT_NOT_EMBEDDED_MESSAGE)
568 # Start getting pages on client side
569 self._get_pages_request = True
Exception: Power BI report is not embedded
Есть ли способ встроить отчеты PowerBI в записные книжки Azure Databricks?
Я попробовал вставить report._embedded=True
сразу после определения объекта report
. Отчет по-прежнему не появляется, а строка pages = report.get_pages()
теперь занимает больше 10 минут и все еще идет, возможно, где-то застряла.
Проверьте это stackoverflow.com/questions/78510054/…
Теперь ваши страницы загружены?
Да, страницы все равно загружаются через 30 минут, что странно: я прервал ячейку блокнота. Я проверил другой ответ, это то же решение, которое вы предложили здесь. К сожалению, похоже, это не работает в Azure Databricks...
Да, даже я получил ответ через долгое время после того, как прервал блокнот
Дайте мне знать, если report._embedded=True решит вашу проблему
Даже если бы это работало, такая большая продолжительность не подходит для производственных целей, поэтому я думаю, что должно быть что-то еще, что должно работать. В любом случае, спасибо за вашу помощь на данный момент
Конечно, дайте мне знать, если я смогу опубликовать это в качестве ответа.
Можете ли вы попробовать обновить браузер (ноутбук), нажав CTRL+F5 после аутентификации?
Эта функция находится в предварительной версии и, возможно, именно она является причиной проблемы. Проверьте это Learn.microsoft.com/en-us/fabric/data-engineering/…
Обновление с помощью CTRL+F5 ничего не меняет. Хорошо, эта функция находится в предварительной версии, но она работает локально с записными книжками Jupyter, но не работает с записными книжками Azure Databricks.
Есть какие-нибудь новости по этому вопросу?
Привет @Rukmini, в настоящее время эта функция не поддерживается в Azure Databricks: github.com/microsoft/powerbi-jupyter/issues/54
Публикация ответа для справки сообщества:
Первоначально я получил ту же ошибку:
Для report.get_pages()
получен отчет Power BI не встроен:
И когда я попытался распечатать отчет, он дал мне нулевой результат:
def azuread_auth(tenant_id: str, client_id: str, client_secret: str, resource_url: str):
"""
Authenticates Service Principal to the provided Resource URL, and returns the OAuth Access Token
"""
url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/token"
payload = f'grant_type=client_credentials&client_id = {client_id}&client_secret = {client_secret}&resource = {resource_url}'
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
response = requests.request("POST", url, headers=headers, data=payload)
access_token = json.loads(response.text)['access_token']
return access_token
tenant_id = 'TenantID'
client_id = 'ClientID'
client_secret = 'ClientSecret'
scope = 'https://analysis.windows.net/powerbi/api/.default'
resource_url = 'https://analysis.windows.net/powerbi/api'
token = azuread_auth(tenant_id, client_id, client_secret, resource_url)
group_id = 'GroupID'
report_id = 'ReportID'
report = Report(group_id=group_id, report_id=report_id, auth=token)
report._embedded=True
print(report._embedded)
Обратите внимание: записные книжки Azure Databricks не поддерживают отображение виджета, поэтому в настоящее время невозможно отобразить отчет. Обратитесь сюда MsDoc
Альтернативно вы можете использовать Jupyter Notebook для отображения отчета, изменив код, включив report._embedded=True
, если он подходит для вашей среды.
Ссылка:
«Исключение: отчет Power BI не встроен» в Azure Databricks · Проблема № 54 · microsoft/powerbi-jupyter · GitHub от orshemesh16
Измените код, установите
report._embedded=True
и запустите код.