El modo de aplicación agrupada

Este modo es equivalente al modo ' tapply ', pero puede ejecutarse sin el paquete cliente ' nzLibrary para R. Presenta un comportamiento similar, pero permite ejecutar una función de tabla de agregación y utilizar una consulta SQL arbitraria, siempre que se ajuste a algunos requisitos básicos.

El archivo R debe contener:
nz.mode
Fijar en ' groupedapply.
nz.fun
La función se ejecuta en los grupos procesados.

El archivo R puede contener además:

nz.shaper
La función de modelado; necesaria si la salida es TABLE(ANY).
nz.shaper.args
Opcional.
nz.shaper.list
Obligatorio si " shaper " es igual a " std.

Este archivo fuente R puede someterse a los pasos habituales de compilación y registro, o puede utilizarse directamente como se describe en la sección Canales de comunicación.

Cuando se realiza una selección, se pasa al siguiente paso, que es la consulta SQL:
SELECT ae_output_t.* FROM (SELECT
ROW_NUMBER() OVER (PARTITION BY pp ORDER BY oo) AS rn,
COUNT(*) OVER (PARTITION BY pp) AS ct,
tt.*
FROM tt) as input_t,
TABLE WITH FINAL (nzr..r_udtf_any(rn, ct, tt.cc,...,
'<R code>')) as ae_output_t;
Los elementos destacables son:
tt
La tabla de entrada.
rn y ct
Las columnas de control, que son procesadas por el código Netezza R que se invoca cuando se elige el modo ' groupedapply '.
r_udtf_cualquiera
El adaptador UTDF de R, que es un UDTF estándar que invoca internamente a R y devuelve TABLE(ANY).
Las columnas de control se utilizan para determinar cuándo empieza y termina una nueva partición. El bucle R interno es similar a:
while (getNext()) {
rn <- getInputColumn(0)
ct <- getInputColumn(1)
if (rn == 1) {
# create a new data frame for this partition
}
# fetch the current row
if (ct == rn) {
# process the frame calling the user-provided
# function and return the function result
}
}
El bucle R asume que las dos primeras columnas son el número de fila y el recuento de filas. En función de sus valores, crea un " data.frame " para cada nueva partición de datos. Cuando el número de filas alcanza el recuento total, se llama a la función de usuario y se le pasa el marco como argumento con el nombre de ' x.
A modo de ejemplo, considere el contenido de " grpdapp.R, que debería guardarse en " /nz/export/ae/workspace:
nz.fun <- function(x)return(mean(x))
nz.mode <- 'groupedapply'
nz.shaper <- 'std'
nz.shaper.list <- list(a=NZ.DOUBLE, b=NZ.DOUBLE,
c=NZ.DOUBLE, d=NZ.DOUBLE)
Dado que existe una tabla llamada iris (que es una copia del conjunto de datos estándar de R), puede llamar a la siguiente consulta:
SELECT ae_output_t.* FROM (SELECT
ROW_NUMBER() OVER (PARTITION BY species ORDER BY sepal_length) AS rn,
COUNT(*) OVER (PARTITION BY species) AS ct,
iris.*
FROM iris) AS input_t,
TABLE WITH FINAL
(nzr..r_udtf_any(rn, ct, sepal_length, sepal_width,
petal_length, petal_width,
CAST('PLAIN_PATH=/nz/export/ae/workspace/grpdapp.R' AS
VARCHAR(64)))) AS ae_output_t;
que produce una salida similar a:
A | B | C | D
-------+-------+-------+-------
6.588 | 2.974 | 5.552 | 2.026
5.006 | 3.428 | 1.462 | 0.246
5.936 | 2.77 | 4.26 | 1.326
(3 rows)
Se pueden obtener los mismos resultados con la siguiente consulta:
SELECT ae_output_t.* FROM (SELECT
ROW_NUMBER() OVER (PARTITION BY species ORDER BY sepal_length) AS rn,
COUNT(*) OVER (PARTITION BY species) AS ct,
iris.*
FROM iris) AS input_t,
TABLE WITH FINAL
(nzr..r_udtf_any(rn, ct, sepal_length, sepal_width, petal_length, petal_width,
CAST('CODE_PLAIN="return(mean(x))", MODE=groupedapply,
SHAPER_LIST="a=NZ.DOUBLE,b=NZ.DOUBLE,c=NZ.DOUBLE,
d=NZ.DOUBLE"'
AS VARCHAR(128)))) AS ae_output_t;