[Fabric] Leer PowerBi data con Notebooks - Semantic Link
El nombre del artículo puede sonar extraño puesto que va en contra del flujo de datos que muchos arquitectos pueden pensar para el desarrollo de soluciones. Sin embargo, las puertas a nuevos modos de conectividad entre herramientas y conjuntos de datos pueden ayudarnos a encontrar nuevos modos que fortalezcan los análisis de datos.
En este post vamos a mostrar dos sencillos modos que tenemos para leer datos de un Power Bi Semantic Model desde un Fabric Notebook con Python y SQL.
¿Qué son los Semantic Links? (vínculo semántico)
Como nos gusta hacer aquí en LaDataWeb, comencemos con un poco de teoría de la fuente directa.
Definición Microsoft: Vínculo semántico es una característica que permite establecer una conexión entre modelos semánticos y Ciencia de datos de Synapse en Microsoft Fabric. El uso del vínculo semántico solo se admite en Microsoft Fabric.
Dicho en criollo, nos facilita la conectividad de datos para simplificar el acceso a información. Si bién Microsoft lo enfoca como una herramienta para Científicos de datos, no veo porque no puede ser usada por cualquier perfil que tenga en mente la resolución de un problema leyendo datos limpios de un modelo semántico.
El límite será nuestra creatividad para resolver problemas que se nos presenten para responder o construir entorno a la lectura de estos modelos con notebooks que podrían luego volver a almacenarse en Onelake con un nuevo procesamiento enfocado en la solución.
Semantic Links ofrecen conectividad de datos con el ecosistema de Pandas de Python a través de la biblioteca de Python SemPy. SemPy proporciona funcionalidades que incluyen la recuperación de datos de tablas , cálculo de medidas y ejecución de consultas DAX y metadatos.
Para usar la librería primero necesitamos instalarla:
%pip install semantic-link
Lo primero que podríamos hacer es ver los modelos disponibles:
import sempy.fabric as fabric
df_datasets = fabric.list_datasets()
Entrando en más detalle, también podemos listar las tablas de un modelo:
df_tables = fabric.list_tables("Nombre Modelo Semantico", include_columns=True)
Cuando ya estemos seguros de lo que necesitamos, podemos leer una tabla puntual:
df_table = fabric.read_table("Nombre Modelo Semantico", "Nombre Tabla")
Esto genera un FabricDataFrame con el cual podemos trabajar libremente.
Nota: FabricDataFrame es la estructura de datos principal de vínculo semántico. Realiza subclases de DataFrame de Pandas y agrega metadatos, como información semántica y linaje
Existen varias funciones que podemos investigar usando la librería. Una de las favoritas es la que nos permite entender las relaciones entre tablas. Podemos obtenerlas y luego usar otro apartado de la librería para plotearlo:
from sempy.relationships import plot_relationship_metadata
relationships = fabric.list_relationships("Nombre Modelo Semantico")
plot_relationship_metadata(relationships)
Un ejemplo de la respuesta:
Conector Nativo Semantic Link Spark
Adicional a la librería de Python para trabajar con Pandas, la característica nos trae un conector nativo para usar con Spark. El mismo permite a los usuarios de Spark acceder a las tablas y medidas de Power BI. El conector es independiente del lenguaje y admite PySpark, Spark SQL, R y Scala. Veamos lo simple que es usarlo:
spark.conf.set("spark.sql.catalog.pbi", "com.microsoft.azure.synapse.ml.powerbi.PowerBICatalog")
Basta con especificar esa línea para pronto nutrirnos de clásico SQL. Listamos tablas de un modelo:
%%sql
SHOW TABLES FROM pbi.`Nombre Modelo Semantico`
Consulta a una tabla puntual:
%%sql
SELECT * FROM pbi.`Nombre Modelo Semantico`.NombreTabla
Así de simple podemos ejecutar SparkSQL para consultar el modelo. En este caso es importante la participación del caracter " ` " comilla invertida que nos ayuda a leer espacios y otros caracteres.
Exploración con DAX
Como un tercer modo de lectura de datos incorporaron la lectura basada en DAX. Esta puede ayudarnos de distintas maneras, por ejemplo guardando en nuestro FabricDataFrame el resultado de una consulta:
df_dax = fabric.evaluate_dax(
"Nombre Modelo Semantico",
""" EVALUATE SUMMARIZECOLUMNS(
'State'[Region], 'Calendar'[Year], 'Calendar'[Month], "Total Revenue"
, CALCULATE([Total Revenue]
)
)
"""
)
Otra manera es utilizando DAX puramente para consultar al igual que lo haríamos con SQL. Para ello, Fabric incorporó una nueva y poderosa etiqueta que lo facilita. Delimitación de celdas tipo "%%dax":
%%dax "Nombre Modelo Semantico" -w "Area de Trabajo"
EVALUATE SUMMARIZECOLUMNS(
'State'[Region], 'Calendar'[Year], 'Calendar'[Month], "Total Revenue"
, CALCULATE([Total Revenue]
)
)
Hasta aquí llegamos con esos tres modos de leer datos de un Power Bi Semantic Model utilizando Fabric Notebooks. Espero que esto les revuelva la cabeza para redescubrir soluciones a problemas con un nuevo enfoque.
0 notes
[Fabric] Protegé credenciales en Notebooks con Azure KeyVault
Ciertamente, cuando usamos notebooks, no todo es transformación y limpieza del contenido de nuestro lakehouse. En distintas oportunidades se nos presenta la opción de utilizarlos para integrar datos. Los Notebooks nos pueden ayudar a conectarnos a APIs en nube u otros entornos cloud directamente usando código.
Para que esta opción sea viable, necesitamos evitar exponer las credenciales o claves del origen de datos usadas en el código. Sino imaginen que cualquier persona con acceso al código (ya sea en Fabric o en el repositorio), podría obtener una key de acceso a una API. Para evitar esto, vamos a utilizar un servicio de Azure que ya existe hace tiempo, Azure KeyVaults.
¿Qué es el servicio de Azure Key Vaults?
En palabras Microsoft "Azure Key Vault es un servicio en la nube para el almacenamiento de los secretos y el acceso a estos de forma segura. Un secreto es todo aquello cuyo acceso desea controlar de forma estricta, como las claves API, las contraseñas, los certificados o las claves criptográficas."
Si bien el servicio varias operaciones, nosotros nos quedaremos con la idea que nos permite ingresar una clave o contraseña a encapsular. Solo usuarios con permiso de lectura de claves al servicio podrá utilizar el encapsulado. De ese modo garantizamos que únicamente usuarios aprobados para usarlo, lo usen.
Veamos como crear este secreto antes de usarlo en un Fabric Notebook.
La creación del servicio es bastante simple, basta seleccionar suscripción + grupo de recursos, nombre, region y plan:
Como mencioné antes, el servicio cuenta con muchas más cosas de las que usaremos nosotros. Ahora nos vamos a concentrar en "Secretos" que es lo que nos interesa.
Aqui por ejemplo ya contamos con tres secretos que usaremos para conectar a la PowerBi Rest API. Guardamos secreto para el tenantid, appid y secretvalue de nuestra app registrada en Azure.
Veamos como generar uno nuevo. Es tan simple como darle un nombre y delimitar lo que queremos encapsular. También podemos delimitarlo como algo temporal:
De ese modo podemos crear un nuevo secreto para nuestro almacén de claves. ¿Qué sigue? permitir la lectura a quien vaya a utilizarlo.
Los recursos de azure se manejan con permisos RBAC (role-based access control). Éstos los encontramos en el "Access Control (IAM)". Podemos abrir nuestro menú de permisos y agregar el que lleva el nombre de "Key Vault Secrets User". La cuenta de EntraID con ese permiso, podrá llamar por código a nuestro secreto almacenado aquí.
Este proceso es muy importante. Imaginen que con esto podríamos dar permisos a un desarrollador para construir un proceso sin saber nunca las credenciales de origen.
¿Cómo llamarlo desde Fabric?
Para utilizar este servicio desde Fabric Notebook usando python, vamos a nutrirnos de la librería de Microsoft que tiene muchas facilidades de interacción. Pueden leer más detalles aqui: https://learn.microsoft.com/en-us/fabric/data-engineering/microsoft-spark-utilities
Dentro de nuestro notebook vamos a comenzar importando SimplePBI para conectarme a la Power Bi Rest API. Luego importaremos las librerías necesarias. El foco está en nuestra tercera celda. Aqui podremos apreciar como llamar el secreto almacenado recientemente:
Utilizamos el método getSecret que necesita dos parámetros. El primero es "Vault URI" que podemos encontrarlo en el Overview de nuestro recurso en el portal de Azure. El segundo es el nombre que le dimos a nuestro secreto.
mssparkutils.credentials.getSecret('https://casa.vault.azure.net/','TenantId')
De ese modo almacenamos en variables nuestro resultado y podemos continuar la autenticación de la API en las siguientes filas que crea un token y pide ver el top 5 de workspaces. Recordemos que aquí buscamos seguridad, no solo de exposición de contraseña en código sino de visualización del contenido del secreto. Si el desarrollador intenta leer la variable se encontrará con una limitante:
NOTA: ésta tercera celda pidiendo el secreto solo puede ser ejecutada por una cuenta logueada en Fabric con permisos "Key Vault Secrets User" en nuestro Key Vault. Sino fallará por prohibición de acceso al secreto.
Espero que esto les sea de utilidad para poner automatizar flujos de manera más segura usando Fabric Notebooks.
0 notes