Agregados del lenguaje R 1

Este ejemplo utiliza el siguiente nombre de archivo: ' maxae.R.

Este ejemplo crea un UDA que encuentra la cadena más larga y el valor numérico más alto de un conjunto de valores de entrada y que devuelve la suma de estos valores.

Concepto

El adaptador del lenguaje R define las siguientes funciones que deben definirse en el archivo fuente de entrada.
  • nz.init
  • nz.accum
  • nz.merge
  • nz.final
Estas funciones se llaman en tiempo de ejecución en pasos posteriores. Para acceder a los datos, las funciones deben utilizar la misma función API que las funciones y las funciones de tabla.

La API C-Analytic-Executable define una API especial para procesar datos en todos los estados. En R, sin embargo, el procesamiento se ha simplificado, y puede utilizar las funciones estándar para acceder a los datos de entrada, los datos de salida y los datos de estado. Dos funciones adicionales que solo se pueden llamar en modo de agregación son la getState función y la getOutputColumn función.

Entrada, salida y estado tienen el siguiente significado en los estados definidos:
Estado de proceso API de entrada Salida API

Inicializar

Ninguna Estado
Acumular Entrada Estado
Fusión Estado Fusionar estado
Finalizar Fusionar estado Resultado
Según la tabla, se aplican las siguientes condiciones:
  • En el estado de inicialización, no hay entrada, y la API de salida se utiliza para establecer los valores de estado iniciales.
  • En el estado de acumulación, la API de entrada accede a los datos de la tabla de entrada, mientras que la API de salida controla las variables de estado.
  • En el estado de fusión, para cada invocación de esta función, otro conjunto de variables de estado es accesible en la entrada procedente de los nodos y/o dataslices que realizan el procesamiento de datos, mientras que la API de salida controla las variables de estado de fusión.
  • En el estado de finalización, las variables de estado de fusión son accesibles a través de la API de entrada, y la API de salida controla la salida UDA, que luego se informa como resultado de la consulta SQL/

Código

Este ejemplo describe un UDA que encuentra el valor máximo en el grupo especificado.

Introduce el siguiente código en el archivo ' /tmp/maxae.R ':
nz.mode <- 'aggregate'
nz.init <- function(){
setOutputNull(0)
}
nz.accum <- function(){
input <- getInputColumn(0)
if (is.null(input))
return()
state <- getOutputColumn(0)
if (is.null(state) || input > state)
setOutputInt32(0, input)
}
nz.merge <- function(){
input <- getInputColumn(0)
# if NULL is encountered, we can skip this value set
# since it must to be coming from an empty data slice
if (is.null(input))
return()
state <- getOutputColumn(0)
if (is.null(state) || input > state)
setOutputInt32(0, input)
}
nz.final <- function () {
input <- as.integer(getInputColumn(0))
if (is.null(input))
setOutputNull(0)
else
setOutputInt32(0, input)
}
Nota: Para el paso de compilación, debe añadir otro objeto , la variable nz.mode a la que asigna el valor dado: 'aggregate'. Si no añades esta variable, obtendrás un error durante la compilación de que el objeto nz.fun no está presente. Establecer nz.mode indica al script de compilación que el AE es un agregado. A continuación, el script busca las funciones que aparecen en Conceptos.

Una compilación

Compila el código:
/nz/export/ae/utilities/bin/compile_ae --language r --template compile \
--version 3 --db dev --user nz /tmp/maxae.R

Registro

En este ejemplo, el conmutador " --template " toma el nuevo valor " uda. Además, el interruptor " --state " aparece para definir las variables de estado agregadas.
/nz/export/ae/utilities/bin/register_ae --language r --template uda \
--version 3 --db dev --user nz --sig 'maxae(INT4)' --return 'INT4' \
--state '(INT4)' --exe maxae.R

En ejecución

Nota: Cuando se ejecuta un UDA en el estado de fusión, el conjunto de variables de estado de entrada incluye variables de estado de trozos de datos sin datos relevantes para la consulta de agregación. Como resultado, puede haber valores de estado de entrada NULL que deben tratarse en la función de fusión.
El siguiente ejemplo incluye comentarios especiales para enfatizar este escenario. Antes de ejecutar el agregado, debe crear una tabla ficticia. Después de ejecutar el agregado, se obtienen los siguientes resultados:
CREATE TABLE grp_test (grp int4, val int4);
CREATE TABLE
INSERT INTO grp_test VALUES (1, 1);
INSERT 0 1
INSERT INTO grp_test VALUES (1, 2);
INSERT 0 1
INSERT INTO grp_test VALUES (1, 3);
INSERT 0 1
INSERT INTO grp_test VALUES (2, 4);
INSERT 0 1
SELECT maxae(val) FROM grp_test;
MAXAE
-------
4
(1 row)
SELECT grp, maxae(val) FROM grp_test GROUP BY grp;
GRP | MAXAE
-----+-------
2 | 4
1 | 3
(2 rows)
SELECT grp, maxae(val) over (partition BY grp) FROM grp_test;
GRP | MAXAE
-----+-------
1 | 3
1 | 3
1 | 3
2 | 4
(4 rows)