
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:

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 SELECT, FROM o WHERE, deben 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:

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 Storage, Azure Storage Blobs, Azure SQL DB, Azure SQL Synapse
- Capacidades para implementación de análisis cognitivos para imágenes o texto complementado con Phyton o 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 .Net, Phyton o 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: