Funciones adicionales de tabla simple en lenguaje R

Para comprender mejor los conceptos de R AE, considere los siguientes ejemplos.

Ejemplo de función de tabla 1

Este ejemplo crea una función que devuelve la longitud total de las columnas de entrada de caracteres y la suma total de todas las columnas de entrada numéricas para cada fila de entrada.

Código

Introduce el siguiente código en el archivo ' /tmp/sampleudtf.R ':
nz.fun <- function () {
while(getNext()) {
tl <- 0
ts <- 0
for (i in seq(inputColumnCount())) {
x <- getInputColumn(i-1)
if (is.character(x)) {
tl <- tl + nchar(x)
}
if (is.numeric(x)) {
ts <- ts + as.double(x)
}
}
setOutputInt32(0, tl)
setOutputDouble(1, ts)
outputResult()
}
}

Una compilación

Compila el archivo como sigue:
/nz/export/ae/utilities/bin/compile_ae --language r --version 3 \
--template compile --user nz --db dev /tmp/sampleudtf.R

Registro

Registre el AE de la siguiente manera:
/nz/export/ae/utilities/bin/register_ae --language r --version 3 --user nz \
--db dev --template udtf --sig 'rtotal(VARCHAR(1024),DOUBLE)' \
--return 'TABLE(length INT4, sum DOUBLE)' --exe sampleudtf.R

En ejecución

Ejecute la UDTF como se indica a continuación:
SELECT * FROM TABLE WITH FINAL(rtotal('text', 1));
LENGTH | SUM
--------+-----
4 | 1
(1 row)

Función de tabla Ejemplo 2

Este ejemplo muestra varias filas de salida. Dado que la longitud total de las columnas de caracteres es un

Código

Introduce el siguiente código en el archivo ' /tmp/sampleudtf.R ':
nz.fun <- function () {
while(getNext()) {
tl <- 0
ts <- 0
for (i in seq(inputColumnCount())) {
x <- getInputColumn(i-1)
if (is.character(x)) {
tl <- tl + nchar(x)
}
if (is.numeric(x)) {
ts <- ts + as.double(x)
}
}
setOutputString(0, 'total length of character columns')
setOutputDouble(1, tl)
outputResult()
setOutputString(0, 'total sum of numerics')
setOutputDouble(1, ts)
outputResult()
}
}

entero, y la suma total de numérico es de tipo doble, elija el tipo de datos más flexible para la segunda columna de salida basándose en los tipos de datos de las entradas, en este caso doble. El código R difiere ligeramente para este ejemplo.

Una compilación

Compila el archivo como sigue:
/nz/export/ae/utilities/bin/compile_ae --language r \
--version 3 --template compile --user nz --db dev \
/tmp/sampleudtf.R

Registro

Registre el AE de la siguiente manera. Debido a la diferencia en la salida, debe especificar una firma de salida diferente durante el registro.
/nz/export/ae/utilities/bin/register_ae --language r \
--version 3 --user nz --db dev --template udtf \
--sig 'rtotal(VARCHAR(1024),DOUBLE)' \
--return 'TABLE(name VARCHAR(64), value DOUBLE)' \
--exe sampleudtf.R

En ejecución

Cuando se llama a esta función, se produce la siguiente salida:
SELECT * FROM TABLE WITH FINAL(rtotal('text', 1));
NAME | VALUE
-----------------------------------+-------
total length of character columns | 4
total sum of numerics | 1
(2 rows)

Función de tabla Ejemplo 3

Cambiando el comando de registro del ejemplo anterior, puede crear una función de firma de entrada dinámica utilizando VARARGS.

Los pasos de Código R y Compilación son los mismos que en el ejemplo anterior.

Registro

Registre el AE de la siguiente manera:
/nz/export/ae/utilities/bin/register_ae --language r --version 3 \
--user nz --db dev --template udtf --sig 'rtotal(VARARGS)' \
--exe sampleudtf.R --return 'TABLE(name VARCHAR(64), value DOUBLE)'

En ejecución

Ahora puede pasar cualquier número de columnas a R:
SELECT * FROM TABLE WITH FINAL(rtotal('text', 1, 'second text',
2, 3, 4, 'the last text'));
NAME | VALUE
-----------------------------------+-------
total length of character columns | 28
total sum of numerics | 10
(2 rows)