Skip to main content

Command Palette

Search for a command to run...

Actualiza el environment de tus notebooks de manera programática

Updated
3 min read

Cuando trabajamos con muchos notebooks en Microsoft Fabric, mantener actualizado el environment asociado puede ser tedioso si tenemos que hacerlo manualmente uno por uno.

Por suerte, gracias a la librería Semantic-Link-Labs, podemos automatizar esta tarea y actualizar el environment de nuestros notebooks de manera sencilla y programática.

Semantic-Link-Labs nos ofrece varias funciones muy útiles para esta tarea:

  • list_notebooks → lista los notebooks dentro de un área de trabajo.

  • list_environments → muestra los entornos definidos en el workspace (o en otro que especifiques).

  • get_notebook_definition → obtiene la definición completa de un notebook.

  • update_notebook_definition → actualiza un notebook con los cambios que necesitemos.

Para la prueba, tengo en un área de trabajo un environment y un notebook asociado a este

Lo primero es instalar la librería en nuestro notebook:

%pip install semantic-link-labs

Obteniendo la definición del notebook

Utilizamos la función get_notebook_definition para ver el contenido del notebook:

import sempy_labs as labs

labs.get_notebook_definition(notebook_name="Notebook 1", format="ipynb")

La salida será un JSON parecido a este:

{
    "cells": [
        {
            "cell_type": "code",
            "source": [
                "# Welcome to your new notebook\\n",
                "# Type here in the cell editor to add code!\\n"
            ],
            "outputs": [],
            "execution_count": null,
            "metadata": {
                "microsoft": {
                    "language": "python",
                    "language_group": "synapse_pyspark"
                }
            },
            "id": "9e2b1999-7e8f-4163-a6cd-33a4fe23ffff"
        }
    ],
    "metadata": {
        "kernel_info": {
            "name": "synapse_pyspark"
        },
        "kernelspec": {
            "name": "synapse_pyspark",
            "display_name": "synapse_pyspark"
        },
        "language_info": {
            "name": "python"
        },
        "microsoft": {
            "language": "python",
            "language_group": "synapse_pyspark",
            "ms_spell_check": {
                "ms_spell_check_language": "en"
            }
        },
        "nteract": {
            "version": "nteract-front-end@1.0.0"
        },
        "spark_compute": {
            "compute_id": "/trident/default",
            "session_options": {
                "conf": {
                    "spark.synapse.nbs.session.timeout": "1200000"
                }
            }
        },
        "dependencies": {
            "environment": {
                "environmentId": "49277563-ad74-49a1-b791-247964afa14a",
                "workspaceId": "69445ea5-e0e6-456d-810b-a291e9b8cae9"
            }
        }
    },
    "nbformat": 4,
    "nbformat_minor": 5
}

La parte que nos interesa está dentro de dependencies, donde se encuentra el environment asignado al notebook.
Si tuvieras un Lakehouse vinculado, también aparecería aquí.

Eliminando el environment

Si lo que queremos es cambiar el environment al predeterminado, basta con eliminar la referencia actual:

import sempy_labs as labs
import json

notebook_name = "Notebook 1"

definition = labs.get_notebook_definition(notebook_name=notebook_name, format="ipynb")
definition = json.loads(definition)

if (
    "metadata" in definition and
    "dependencies" in definition["metadata"] and
    "environment" in definition["metadata"]["dependencies"]
):
    print(f"Actualizando notebook: {notebook_name}")
    definition["metadata"]["dependencies"]["environment"] = {}

    updated_definition_str = json.dumps(definition)

    labs.update_notebook_definition(name =notebook_name, notebook_content =updated_definition_str, format="ipynb")

Al abrir el notebook de nuevo, verás que aparece el environment por defecto.

Asignando un nuevo environment

También podemos cambiar el notebook para que apunte a otro environment (incluso en otra área de trabajo):

notebook_name = "Notebook 1"
environment_id = "38d5bb5e-897e-44d7-927c-e902590da88c"
workspace_id = "e42acae6-20f9-4929-a0b8-345b096b0217"

definition = labs.get_notebook_definition(notebook_name=notebook_name, format="ipynb")
definition = json.loads(definition)

if (
    "metadata" in definition and
    "dependencies" in definition["metadata"] and
    "environment" in definition["metadata"]["dependencies"]
):
    print(f"Actualizando notebook: {notebook_name}")

    definition["metadata"]["dependencies"]["environment"] = {"environmentId": environment_id, "workspaceId": workspace_id}
    updated_definition_str = json.dumps(definition)

    labs.update_notebook_definition(name =notebook_name, notebook_content =updated_definition_str, format="ipynb")

Al reabrir el notebook, verás el nuevo environment asignado.

¿Cómo puedo obtener el environmentId?

Con la función list_environments podemos listar fácilmente todos los entornos disponibles:

Si no pasamos ningún parámetro, se buscarán los environments en el área de trabajo actual.
También podemos especificar otro workspace si queremos reutilizar environments definidos en otro lugar.

Automatización para todos los notebooks de un área de trabajo

Si trabajamos en proyectos grandes con decenas o cientos de notebooks, lo ideal es automatizar el proceso. Con este ejemplo, actualizamos en bloque todos los notebooks de un área de trabajo:

notebooks_df = labs.list_notebooks()

for _, row in notebooks_df.iterrows():
    notebook_id = row["Notebook Id"]
    notebook_name = row["Notebook Name"]
    print(f"{notebook_id} - {notebook_name}")

    definition = labs.get_notebook_definition(notebook_name=notebook_name, format="ipynb")
    definition = json.loads(definition)

    if (
        "metadata" in definition and
        "dependencies" in definition["metadata"] and
        "environment" in definition["metadata"]["dependencies"]
    ):
        print(f"Actualizando notebook: {notebook_name}")

        definition["metadata"]["dependencies"]["environment"] = {}
        updated_definition_str = json.dumps(definition)

        labs.update_notebook_definition(
            name =notebook_name,
            notebook_content =updated_definition_str,
            format="ipynb"
        )
    else:
        print("Este notebook no tiene environment definido.")

More from this blog

D

DataGym | Microsoft Fabric

36 posts