R função da tabela de idiomas (modo remoto) 2
Este exemplo mostra como você pode usar o modo remoto para salvar o estado de processamento de dados entre consultas subsequentes.
Código
Defina o conjunto usual de objetos R AE salvando-os no arquivo /tmp/remote.R da seguinte forma:
nz.fun <- function () {
if (!exists('x', envir=.GlobalEnv))
x <<- 0
x <<- x + 1
getNext()
setOutput(0, x)
outputResult()
}
Aqui, o operador de atribuição global <<- garante que o mesmo contador x esteja disponível em todas as chamadas.
Compilação
Aqui, o operador de atribuição global <<- garante que o mesmo contador x esteja disponível em todas as chamadas.
/nz/export/ae/utilities/bin/compile_ae --language r \
--template compile --version 3 --db dev --user nz /tmp/remote.R
Registro
Registre o iniciador da seguinte forma:
/nz/export/ae/utilities/bin/register_ae --language r \
--version 3 --template udtf --db dev --user nz \
--level 4 --mask DEBUG --sig "remote_rae_launch(int8)" \
--return "TABLE(aeresult varchar(255))" \
--remote --rname remote_rae --launch
Next, register the actual data-processing interface:
/nz/export/ae/utilities/bin/register_ae --language r \
--version 3 --template udtf --db dev --user nz --level 4 \
--mask DEBUG --lastcall 'table final' --exe remote.R \
--sig "remote_rae(VARARGS)" --return "TABLE(cnt DOUBLE)" \
--remote --rname remote_rae
Executando
A execução de um AE remoto requer duas etapas.
Na primeira etapa, inicie o AE remoto da seguinte forma:
SELECT * FROM TABLE WITH FINAL(REMOTE_RAE_LAUNCH(0));
O exemplo de saída pode ser parecido com o seguinte:
AERESULT
----------------------------------------------------
tran: 91488 session: 16067 data slc: 0 hardware: 0 \
machine: netezza process: 13230 thread: 13230
(1 row)
Agora, execute a consulta de processamento de dados real:
SELECT * FROM TABLE WITH FINAL(remote_rae(0));
CNT
-----
1
(1 row)
As chamadas subsequentes devem retornar 2, 3 e assim por diante, pois o objeto global x é incrementado toda vez que o AE remoto é chamado.
R Language Shapes & Sizer com AEs remotos
Se o arquivo /tmp/remote.R for atualizado para incluir as duas últimas linhas do exemplo de código abaixo, o R AE remoto poderá ser registrado e executado com TABLE(ANY) especificado como saída.
nz.fun <- function () {
if (!exists('x', envir=.GlobalEnv))
x <<- 0
x <<- x + 1
getNext()
setOutput(0, x)
outputResult()
}
nz.shaper <- 'std'
nz.shaper.list <- list(value=NZ.DOUBLE)
Observe que as novas variáveis, nz.shaper e nz.shaper.list, são analisadas somente se o UDAP estiver registrado com TABLE(ANY). Como resultado, não há necessidade de alterar o nome do arquivo compilado, pois o arquivo é substituído.
Portanto, a compilação é a mesma que no caso da função de tabela remota. O registro do iniciador UDX também é o mesmo. No entanto, o registro da interface de processamento de dados tem TABLE(ANY) como sua assinatura de saída e um nome UDX diferente:
/nz/export/ae/utilities/bin/register_ae --language r \
--version 3 --template udtf --db dev --user nz --level 4 \
--mask DEBUG --lastcall 'table final' --exe remote.R \
--sig "remote_rae2(VARARGS)" --return "TABLE(ANY)" \
--remote --rname remote_rae
SELECT * FROM TABLE WITH FINAL(remote_rae(0));
CNT
-----
4
(1 row)
SELECT * FROM TABLE WITH FINAL(remote_rae2(0));
VALUE
-------
5
(1 row)