Actualizando el modelo semántico


Introducción
¿Cuál es la razón para actualizar un modelo semántico de Power BI en modo Direct Lake? Se podría pensar que con Direct Lake, esto no sería necesario.
Bueno, la respuesta es un tanto compleja. Si bien en el sentido tradicional no se requiere una actualización como en el modo de importación, con Direct Lake los cambios en tu OneLake se reflejan automáticamente en Power BI (siempre que tengas un Lakehouse o Warehouse configurado encima). Sin embargo, hay situaciones en las que deseas desactivar esta función de detección de cambios en Direct Lake y reflejarlos manualmente en Power BI.
De hecho, Microsoft proporciona una configuración explícita para este propósito, como se detalla en la documentación de Direct Lake. Además, nos brindan un escenario específico sobre cuándo puede ser útil activar esta configuración:
«Es posible que desee desactivar si, por ejemplo, necesitas permitir la finalización de los trabajos de preparación de datos antes de exponer cualquier dato nuevo a los consumidores del modelo. Cuando se desactiva, puede invocar la actualización manualmente o utilizando las API de actualización. Invocar un refresco para un modelo Direct Lake es una operación de bajo coste en la que el modelo analiza los metadatos de la última versión de la tabla Delta Lake y se actualiza para hacer referencia a los últimos archivos de OneLake»
Por lo tanto, una situación en la que desactivar esta función podría ser cuando no deseas que los cambios en tus tablas se expongan instantáneamente a tus consumidores, sino solo después de que todas las tablas se hayan sincronizado con éxito.
Además, una actualización en Direct Lake no implica cargar (y duplicar) los datos en Power BI como en el modo de importación, simplemente implica que le indicamos a Power BI que consulte la última versión de las tablas delta. De hecho, dado que no se trata de una «actualización» en el sentido clásico, nos referimos a ella como reframing.
Por un lado, este enfoque nos brinda más control sobre cuándo y en qué estado se exponen los datos. Sin embargo, la desventaja es que perdemos el aspecto de tiempo casi real de Direct Lake. Además, actualmente una actualización de Direct Lake también borra toda la caché de tu modelo semántico. Por lo tanto, podrías considerar precalentar tu modelo semántico como parte de tu pipeline de refresco.
Para invocar este reframing, puedes utilizar la API de actualización o la nueva actividad Semantic Model Refresh Pipeline. En este artículo, veremos las diferentes opciones que tenemos para actualizar el modelo, ya sea de forma completa o parcial.
Refrescando el modelo semántico desde la canalización de datos
via Power BI API
- Configurar una nueva conexión
Para comenzar, es necesario configurar una nueva conexión web V2 que se utilizará para llamar a la API. Para ello, haz clic en el icono de configuración en la parte superior derecha y luego selecciona «Manage connections and gateways».
Connection type: Web V2
Base Url: https://api.powerbi.com/v1.0/myorg
Token Audience Url: https://analysis.windows.net/powerbi/api
Para el método de autenticación, he seleccionado OAuth 2.0. Debes proporcionar tus credenciales haciendo clic en «Editar credenciales» para poder crear la conexión. En este proceso, te autenticas como usuario y luego el data pipeline se autentica en Fabric en tu nombre. En un escenario real, es altamente recomendable utilizar un service principal en lugar del método OAuth 2.0.
- Data Pipeline
Creamos un Data Pipeline y añadimos la actividad Web
Relative URL: groups/[WorkspaceID]/datasets/[SemanticModelID]/refreshes (puedes encontrar el WorkspaceID y el SemanticModelID en la barra de URL de su navegador haciendo clic en el modelo semántico en Fabric)
Method: POST
Body:{}
Headers: content-type como Name y application/json como Value
Una vez ejecutado, podemos ver en el historial de refrescos como se ha completado via Api.
Actividad Semantic Model Refresh
A partir del 15 de abril de 2024, también es posible utilizar las canalizaciones de Fabric para actualizar un modelo semántico como actividad de una canalización. Actualmente, esta actualización se aplica al conjunto de datos completo y no a las tablas ni a las particiones individuales.
Una vez ejecutado, podemos ver en el historial de refrescos como se ha completado via Enhanced Api.
Como refrescar particiones o tablas en un modelo semántico
En las anteriores opciones, hemos visto como refrescar nuestro modelo semántico de manera completa pero también es posible actualizar tablas individuales e incluso particiones a través de la Enhanced API, simplemente especificando esas tablas en el body.
Relative URL: groups/[WorkspaceID]/datasets/[SemanticModelID]/refreshes
Method: POST
Body:
{
"type": "Full",
"commitMode": "transactional",
"maxParallelism": 2,
"retryCount": 2,
"objects": [
{
"table": "your_table_name"
}
]
}
Refrescando el modelo semántico desde Notebook
Usando PowerBIRestClient
import sempy.fabric as fabric
client = fabric.PowerBIRestClient()
datasetId = "datasetID"
client.post(f"/v1.0/myorg/datasets/{datasetId}/refreshes")
Usando TMSL
tmsl_script = {
"refresh": {
"type": "full",
"objects": [
{
"database": "DEV_v2",
"table": "FactInternetSales"
}
]
}
}
fabric.execute_tmsl(workspace="DEV", script=tmsl_script)
Uso de Enhanced Refresh API
# Define the dataset and workspace
import sempy.fabric as fabric
dataset = "DEV_v2"
workspace = "DEV"
# Objects to refresh, define using a dictionary
objects_to_refresh = [
{
"table": "FactInternetSales"
}
]
# Refresh the dataset
fabric.refresh_dataset(
workspace=workspace,
dataset=dataset,
objects=objects_to_refresh,
)
# List the refresh requests
fabric.list_refresh_requests(dataset=dataset, workspace=workspace)
Usando TOM (Semantic Link v>=0.7)
%pip install semantic-link --q
import sempy.fabric as fabric
from typing import List
def refresh_selected_tables(workspace_name:str, dataset_name:str, tables:List[str]=None, refresh_type:str="DataOnly"):
ws = workspace_name or fabric.resolve_workspace_name(fabric.get_workspace_id())
all_tables = fabric.list_tables(dataset=dataset_name, workspace=ws)['Name']
selected_tables = all_tables if tables is None else tables
import Microsoft.AnalysisServices.Tabular as tom
tom_server = fabric.create_tom_server(False, ws)
tom_database = tom_server.Databases.GetByName(dataset_name)
if refresh_type == "DataOnly":
refreshtype = tom.RefreshType.DataOnly
elif refresh_type == "Full":
refreshtype = tom.RefreshType.Full
elif refresh_type == "Calculate":
refreshtype = tom.RefreshType.Calculate
elif refresh_type == "ClearValues":
refreshtype = tom.RefreshType.ClearValues
elif refresh_type == "Defragment":
refreshtype = tom.RefreshType.Defragment
else:
print("Enter valid refresh type, Valid values : DataOnly, Full, Calculate, ClearValues, Defragment")
try:
for table in selected_tables:
print("Refreshing : ",table)
tom_database.Model.Tables[table].RequestRefresh(refreshtype)
except Exception as e:
print("----Refresh Failed----")
print(f"An error occurred: {e}")
tom_database.Model.SaveChanges()
fabric.refresh_tom_cache(workspace=ws)
refresh_selected_tables(workspace_name="DEV", dataset_name="DEV_v2")
Subscribe to my newsletter
Read articles from Kilian Baccaro Salinas directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
