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.
- 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.
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).
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.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)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;