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/

No hay comentarios:

Publicar un comentario