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
- nz.init
- nz.accum
- nz.merge
- nz.final
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.
| Estado de proceso | API de entrada | Salida API |
|---|---|---|
Inicializar |
Ninguna | Estado |
| Acumular | Entrada | Estado |
| Fusión | Estado | Fusionar estado |
| Finalizar | Fusionar estado | Resultado |
- 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.
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)
}Una compilación
/nz/export/ae/utilities/bin/compile_ae --language r --template compile \
--version 3 --db dev --user nz /tmp/maxae.RRegistro
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.REn ejecución
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)