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)

%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")
0
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

Kilian Baccaro Salinas
Kilian Baccaro Salinas