Funzioni aggiuntive di tabella semplice in linguaggio R

Per comprendere meglio i concetti di R AE, si considerino i seguenti esempi.

Esempio di funzione della tabella 1

Questo esempio crea una funzione che restituisce la lunghezza totale delle colonne di input di caratteri e la somma totale di tutte le colonne di input numerici per ogni riga di input.

Codice

Inserite il seguente codice nel file '/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()
}
}

Compilazione

Compilare il file come segue:
/nz/export/ae/utilities/bin/compile_ae --language r --version 3 \
--template compile --user nz --db dev /tmp/sampleudtf.R

Registrazione

Registrare l'AE come segue:
/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

In esecuzione

Eseguire l'UDTF come segue:
SELECT * FROM TABLE WITH FINAL(rtotal('text', 1));
LENGTH | SUM
--------+-----
4 | 1
(1 row)

Tabella Funzione Esempio 2

Questo esempio mostra più righe di output. Poiché la lunghezza totale delle colonne di caratteri è un

Codice

Inserite il seguente codice nel file '/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()
}
}

e la somma totale di numeric è di tipo double, scegliete il tipo di dati più flessibile per la seconda colonna di uscita in base ai tipi di dati degli ingressi, in questo caso double. Il codice R è leggermente diverso per questo esempio.

Compilazione

Compilare il file come segue:
/nz/export/ae/utilities/bin/compile_ae --language r \
--version 3 --template compile --user nz --db dev \
/tmp/sampleudtf.R

Registrazione

Registrare l'AE come segue. A causa della differenza di output, è necessario specificare una firma di output diversa durante la registrazione.
/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

In esecuzione

Quando si chiama questa funzione, viene prodotto il seguente output:
SELECT * FROM TABLE WITH FINAL(rtotal('text', 1));
NAME | VALUE
-----------------------------------+-------
total length of character columns | 4
total sum of numerics | 1
(2 rows)

Tabella Funzione Esempio 3

Modificando il comando di registrazione dell'esempio precedente, è possibile creare una funzione di firma di ingresso dinamica utilizzando VARARGS.

I passaggi relativi al codice R e alla compilazione sono gli stessi dell'esempio precedente.

Registrazione

Registrare l'AE come segue:
/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)'

In esecuzione

È ora possibile passare a R un numero qualsiasi di colonne:
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)