Azure: ¿Qué es U-SQL?

Azure: ¿Qué es U-SQL?

Photo by Ben Mack on Pexels.com

Hace algún tiempo atrás, cuando inicie a laborar en el área de tecnologías de información, tuve la oportunidad de participar en proyectos de desarrollo de páginas web en arquitecturas cliente-servidor, utilizando C# para el código de “Back-end” y al mismo tiempo, una capa de acceso a datos con llamados a procedimientos almacenados en T-SQL. Prácticamente dicha arquitectura requería conocer de ambos lenguajes, pero desarrollados en capas independientes. Pues justamente por ese motivo me asombró mucho conocer que hoy en día existe un lenguaje de Microsoft que entrelaza a ambos mundos: U-SQL. 

Utilizar U-SQL es el equivalente de combinar un lenguaje declarativo similar a T-SQL (pero que no es ANSI SQL), con la programación imperativa en C#. Es uno de los lenguajes nuevos que ha traído consigo Azure, y en este caso, específicamente para el uso del servicio Azure Data Lake Analytics para consultas de “big data”. U-SQL es un lenguaje que permite realizar consultas y combinar datos originados en distintos tipos de almacenamiento. Si desea conocer un poco más de estos tipos de almacenamientos, le invito a visitar la publicación “Azure: ¿Cómo clasificar datos y elegir almacenamiento?”.: Algunas fuentes de almacenamiento que permiten manipular U-SQL pueden ser por ejemplo: Azure Data Lake Storage, Azure Blob Storage, bases de datos Azure SQL, SQL Synapse o instancias de SQL que corran sobre máquinas virtuales de Azure. 

Los scripts escritos en U-SQL se pueden presentar de distintas maneras, por ejemplo, utilizando Azure Data Lake Tools para Visual Studio (se baja la versión del complemento según sea la versión del Visual Studio – Microsoft Download), desde el portal de Azure o mediante el uso de Azure Powershell. 

Los scripts se pueden ejecutar de manera local, esto si los datos a leer o escribir residen en la máquina local, donde esta opción tiene la ventaja que no tiene costo. O bien, puede ser una ejecución en la nube, usando una cuenta de Azure Data Lake Analytics. En este caso si tiene un costo cada cálculo y almacenamiento de datos que se realice en la nube. 

La unidad principal de un programa U-SQL es un script, que consiste en una secuencia de declaraciones: 

Script:= Statement_List 
Statement_List := {[Statement]’;’} 

Cada sentencia debe terminar con el símbolo de punto y coma (;). Lo cual, ya de todas maneras es una buena práctica, incluso en T-SQL regular. Las declaraciones que se pueden utilizar en U-SQL son las siguientes: 

  • Bloques IF…ELSE 
  • Declaración de VARIABLES 
  • Referencias a un ASSEMBLY 
  • Data Definition Language (DDL) 
  • Consultas 
  • Procedimientos almacenados de U-SQL 
  • Importación de paquetes (assemblies) 
  • Data Modification Language (DML: INSERT) 
  • Escritura a un flujo de datos por medio de OUTPUT 

Veamos un ejemplo de código en U-SQL. Supongamos que tenemos el siguiente archivo de formato csv como se muestra a continuación: 

Figura No.1: formato del archivo csv de territorios

Posteriormente se crea un script en un proyecto local de tipo “U-SQL Project” donde definimos una entrada de datos como un archivo llamado “Territorios.csv”, así como una salida de datos con el nombre de archivo “AreasFiltradas.csv”. En este ejemplo vamos a utilizar la clase que provee U-SQL llamada “Extractors” que permite generar un conjunto de filas a partir de un archivo. De manera nativa U-SQL provee las clases para los tipos de archivos “Text”, “Csv” y “Tsv”. En este ejemplo vamos a utilizar el extractor para un tipo de archivo csv

@entrada =  
    EXTRACT Pais            string,  
            Ciudad          string,  
            Latitud         string,  
            Longitud        string,  
            Poblacion       int,  
            Elevacion       decimal,  
            Alcalde         string, 
            Fundacion       int, 
            WebSite         string, 
            Extension       int 
    FROM "/Demos/Territorios.csv" 
    USING Extractors.Csv(skipFirstNRows : 1); 
  
@salida = 
    SELECT Pais 
           , Ciudad 
           , String.Concat(Latitud, " ", Longitud) AS Coordenadas 
           , Poblacion 
           , Elevacion 
           , Elevacion > 1000? "Si" : "No" AS EsElevacionMayorMil 
           , Alcalde.ToUpper() AS Alcalde 
           , Fundacion 
           , WebSite.Trim() AS WebSite 
           , Extension 
           //Texto comentado, puede invocar su propia clase 
    FROM @entrada 
    WHERE Extension<5000; 
  
OUTPUT @salida 
    TO "/Demos/AreasFiltradas.csv" 
    USING Outputters.Csv(outputHeader:true); 

Nótese como palabras claves como SELECTFROM WHEREdeben ir en mayúscula, porque el U-SQL es sensible a Mayúsculas (Case Sensitive). Al extraer los datos se indica el nombre y el tipo de datos que contiene (se especifica el esquema de datos esperado), así como la indicación que no lea la primera fila del encabezado del archivo (skipFirstNRows igual a 1 fila). Luego de leer el archivo, se utiliza el refinamiento del resultado, conocido como un “RowSet” el cuál tiene el nombre de “@salida”. En el flujo del SELECT se pueden utilizar construcciones como “String.Concat” para concatenar columnas en este caso de texto, “ToUpper” para pasar a mayúscula, “Trim” para eliminar espacios en blanco. En el “WHERE”, se filtró las áreas de extensión menores a cinco mil. También se utilizó el condicional bajo la forma “?:” para evaluar una condición de falso o verdadero de manera que si la condición se cumple (Extension>1000), se retorna la primera expresión, de lo contrario, se retorna la segunda expresión.  

Luego de ejecutar el script U-SQL, la salida se ve de la siguiente manera: 

Figura No.2: resultado de la ejecución de la consulta

Casos de posibles usos

  • Los scripts de U-SQL siguen el patrón de extracción, transformación y carga (lo que hacemos en ETLs), por lo cual se pueden utilizar para tareas de este tipo por ejemplo para pasar datos en un Azure Data Lake de la zona de datos de ingesta a la zona de datos de curados 
  • Permite interacción para realizar consultas en múltiples fuentes de datos de Azure sin tener que mover los datos, por ejemplo, Azure Data Lake StorageAzure Storage BlobsAzure SQL DBAzure SQL Synapse 
  • Capacidades para implementación de análisis cognitivos para imágenes o texto complementado con Phyton R 

Beneficios

  • Escalable a procesar volúmenes de información de tera o peta bytes 
  • Lenguaje simple de consulta para todos los datos siguiendo la estructura “SELECT – FROM  – WHERE” 
  • Escoger la opción de diseño según la necesidad: si se opta por lenguajes como pertenecientes a la familia .NetPhyton R 
  • Utilización de “assemblies”  o “ddl’s” que permiten la posibilidad de encapsular lógica compleja que puede ser invocada desde la construcción del script en U-SQL 

Posteriormente en otras publicaciones se irán desarrollando otros temas relacionados a U-SQL con ejemplos de paso a paso de cómo ejecutar scripts en Azure y también como ejecutarlos de manera local. 

Recursos: 

https://docs.microsoft.com/en-us/u-sql/

Leave a comment