Mostrando entradas con la etiqueta functions. Mostrar todas las entradas
Mostrando entradas con la etiqueta functions. Mostrar todas las entradas

domingo, 27 de abril de 2025

GCP: Google Cloud Run

En esta ocasión veremos qué es y para qué sirve Google Cloud Run. Google Cloud Run es una plataforma serverless que permite ejecutar aplicaciones en contenedores de manera escalable y sin preocuparse por la infraestructura subyacente.

Según la documentación oficial:

  • Puedes ejecutar contenedores como aplicaciones web, microservicios, funciones sin servidor y trabajos de procesamiento por lotes. 
  • Cloud Run gestiona la infraestructura, permitiéndote enfocarte en el código y la aplicación, sin preocuparte por la gestión de servidores.

Lo que se puede hacer:

  1. Desplegar aplicaciones web y APIs: Ejecuta aplicaciones web, microservicios o APIs RESTful en contenedores, con soporte para lenguajes como Python, Node.js, Java, Go, etc. 
  2. Escalado automático: Escala automáticamente los contenedores según la demanda (de cero a miles de instancias) y reduce a cero cuando no hay tráfico, optimizando costos. 
  3. Ejecutar tareas programadas o eventos: Procesa eventos de Pub/Sub, Cloud Scheduler o desencadenantes HTTP para tareas como procesamiento de datos, ETL o automatización. 
  4.  Soporte para aplicaciones stateless: Ideal para aplicaciones sin estado que manejan solicitudes HTTP o eventos, como backend para aplicaciones móviles o sitios web. 
  5. Integración con CI/CD: Automatiza despliegues con herramientas como Cloud Build, GitHub Actions o GitLab, permitiendo flujos de desarrollo continuo. 
  6. Gestión simplificada: No requiere gestionar servidores; Google Cloud Run maneja parches, actualizaciones y balanceo de carga. 
  7. Soporte para WebSockets: Útil para aplicaciones en tiempo real, como chats o juegos. 
  8. Integración con otros servicios de Google Cloud: Conecta fácilmente con Cloud Storage, Firestore, BigQuery, o bases de datos como Cloud SQL para construir aplicaciones complejas. 
  9.  Despliegue de aplicaciones de machine learning: Sirve modelos de ML en contenedores para inferencia en tiempo real. 
  10. Personalización de entornos: Usa imágenes de contenedores personalizadas con Docker, permitiendo flexibilidad en dependencias y configuraciones. 
  11. Seguridad y autenticación: Integra con Identity-Aware Proxy (IAP), Firebase Authentication o OAuth para proteger endpoints, y soporta dominios personalizados con HTTPS. 
  12. Ejecución de trabajos (Jobs): Ejecuta tareas de corta duración, como migraciones de bases de datos o procesamiento por lotes, con Cloud Run Jobs.

Cloud Run es ideal para desarrolladores que buscan una solución serverless, escalable y fácil de usar para desplegar aplicaciones modernas, con un modelo de pago por uso que optimiza costos.

Enlaces:

https://cloud.google.com/run

viernes, 21 de marzo de 2025

Funciones Javascript en BigQuery

 

BigQuery permite crear Stored Procedures y/o funciones usando como lenguaje base a Javascript. En este post veremos las UDF o las funciones definidas por el usuario.

Una función definida por el usuario (UDF) nos permite crear una función mediante una expresión SQL o código JavaScript.

Una UDF puede ser:

  1. Persistente o 
  2. Temporal (en el alcance de una única consulta).

Aquí podemos ver un ejemplo sacado de la página de documentación oficial de GCP:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
CREATE TEMP FUNCTION multiplyInputs(x FLOAT64, y FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS r"""
  return x*y;
""";

WITH numbers AS
  (SELECT 1 AS x, 5 as y
  UNION ALL
  SELECT 2 AS x, 10 as y
  UNION ALL
  SELECT 3 as x, 15 as y)
SELECT x, y, multiplyInputs(x, y) AS product
FROM numbers;

Se trata de una UDF temporal (usando TEMPORARY o TEMP)  que multiplica dos números tipo FLOAT64. Dentro del privote ``numbers`` habrá dos uniones con los datos a trabajar; invocaremos la función mediante una consulta SELECT y asignará el resultado como ``product``.

Tipos de datos permitidos

 Tipos de datos en BigQuery   Tipos de datos en Javascript  
 ARRAY  ARRAY
 BOOL  BOOLEAN
 BYTES  STRING base 64
 NUMERIC, BIGNUMERIC  Valor punto flotante
 STRING  STRING
 STRUCT  OBJECT
 TIMESTAMP  DATE
 DATE  DATE
 JSON  OBJECTS, ARRAY

Recordar que en Javascript no existen los tipos de manera explícita.

Ejemplo 1. Crearemos una función (persistente) BigQuery que use JS como lenguaje base para obtener la longitud de una cadena.

1
2
3
4
5
6
7
CREATE OR REPLACE FUNCTION `myproject.mydataset.longitud`(input STRING) RETURNS STRING LANGUAGE js AS '''
   if(input === '' || input ===null){
      return "La cadena tiene una longitud de 0 caracteres.";
   }else{
      return "La cadena tiene una longitud de: "+input.length+" caracteres.";
   }
'''

Para hacer uso de ella la invocaremos de esta forma:

1
2
DECLARE cadena STRING DEFAULT '';
SELECT `myproject.mydataset.longitud`(cadena) as resultado; 

El dato de entrada será la variable ``cadena`` cuyo valor será vacío. Lo que nos devolverá:

1
La cadena tiene una longitud de: 0 caracteres.

Está función obtiene la longitud de una cadena introducida por el usuario. No mucho por explicar.

Ejemplo 2. Crear una sencilla función para evaluar si una condición o valor booleano es "correcta" si es true, "incorrecta" si es false.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
CREATE OR REPLACE FUNCTION `myproject.mydataset.checkAssert`(condition BOOL) RETURNS STRING LANGUAGE js AS '''

  var result = "Evaluacion: "+condition+".";

  if(condition){
    result += " Es correcta.";
  }else{
    result += " Es incorrecta.";
  } 

  return result;

'''

Invocamos la función:

1
2
3
4
DECLARE condition BOOL;
SET condition= 34 > 0;

SELECT `myproject.mydataset.checkAssert`(condition) AS resultado ;

Hacer uso de UDF con Javascript como lenguaje base puede ayudarnos a resolver tareas que quizás de una manera más nativa sería algo más complicado.

Continuaremos con este tema en próximas entregas.

Enlaces:

https://cloud.google.com/bigquery/docs/user-defined-functions
https://stackoverflow.com/questions/62271743/bringing-in-a-function-from-javascript-to-big-query-standardsql
https://hoffa.medium.com/new-in-bigquery-persistent-udfs-c9ea4100fd83
https://briangrinstead.com/blog/js-functions-bigquery/

sábado, 29 de julio de 2023

PL/SQL - Bloques

PL/SQL es un lenguaje de programación procedimental para manipular datos de una BD Oracle. Con este lenguaje podemos crear scripts para poder manipular información de tablas, ejecutar otros scripts, crear procedimientos que se activen ante un evento(triggers), que devuelvan valores (funciones) o que simplementen realicen una operación al invocar un procedimiento (stored procedures).

Si queremos saber la versión instalada podemos ejecutar esta sentencia:

-- Con una consulta 
SELECT * FROM v$version;

En PL/SQL podríamos ejecutar el siguiente bloque de código:


-- Con un bloque PL/SQL
SET SERVEROUTPUT ON;
DECLARE
    version_inst VARCHAR(200);
    consulta VARCHAR(200):='SELECT BANNER FROM v$version';
BEGIN
    -- Ejecutamos consulta
    EXECUTE IMMEDIATE consulta INTO version_inst;
    dbms_output.put_line('Version instalada: '||version_inst);
END;
/

Si queremos podríamos crear excepciones:

-- Con un bloque PL/SQL con manejo de excepción
SET SERVEROUTPUT ON;
DECLARE
   NULL_STRING EXCEPTION;
   PRAGMA 
   EXCEPTION_INIT(NULL_STRING, -06535);
   version_inst VARCHAR(200);
   consulta VARCHAR(200);
BEGIN
    -- Ejecutamos consulta
    EXECUTE IMMEDIATE consulta INTO version_inst;
    dbms_output.put_line('Version instalada: '||version_inst);
    EXCEPTION
        WHEN NULL_STRING THEN
           dbms_output.put_line('Error: No existe la tabla o la consulta es erronea o esta vacía');
END;
/

Como se puede ver, creamos una excepción (NULL_STRING) para verificar que la cadena de consulta es nula (vacía). Usamos PRAGMA la cual es una palabra reservada de Oracle para añadir directivas al compilador. Ésta le dice al compilador que se comporte de cierta manera, en este caso es una excepción (un error en el flujo del programa).

El pragma EXCEPTION_INIT asocia un nombre de excepción con un número de error de Oracle. Puede interceptar cualquier error ORA- y escribir un controlador específico para él en lugar de usar el controlador OTROS (OTHERS).

La sección de EXCEPTION WHEN se ejecuta cuando ocurre alguna excepción. Dependiendo de la programación se podrá (o no) cachar correctamente la excepción. Recordar que una excepción es una anomalía en el flujo de un programa, no necesariamente es un error grave. En caso de un error, el programa se terminará abruptamente.


Al final tendríamos algo como esto:

-- Con un bloque PL/SQL y verificando consulta
SET SERVEROUTPUT ON;
DECLARE
   NULL_STRING EXCEPTION;
   PRAGMA 
   EXCEPTION_INIT(NULL_STRING, -06535);
   version_inst VARCHAR(200);
   consulta VARCHAR(200):='SELECT BANNER FROM v$version';
BEGIN
    IF LENGTH(consulta) > 0 THEN
       -- Ejecutamos consulta
       EXECUTE IMMEDIATE consulta INTO version_inst;
       dbms_output.put_line('Version instalada: '||version_inst);
    END IF;
    EXCEPTION
        WHEN NULL_STRING THEN
           dbms_output.put_line('Error: No existe la tabla o la consulta es erronea o esta vacía');
END;
/

En próximos post veremos más ejemplos.

Enlaces:

https://livesql.oracle.com/
https://www.techonthenet.com/oracle
http://www.rebellionrider.com
https://docs.oracle.com
https://www.codifica.me/pragma/
https://elbauldelprogramador.com/plsql-excepciones/

Jai un lenguaje de programación inspirado en C++

Hoy hablaremos de un nuevo lenguaje de programación llamado Jai . Se trata de un lenguaje de programación que está desarrolland...

Etiquetas

Archivo del blog