R fonction de la table des langues (mode à distance) 2

Cet exemple montre comment vous pouvez utiliser le mode à distance pour sauvegarder l'état du traitement des données entre les requêtes suivantes.

Coder

Définissez l'ensemble habituel d'objets R AE en les enregistrant dans le fichier /tmp/remote.R comme suit :

nz.fun <- function () { 
  if (!exists('x', envir=.GlobalEnv)) 
    x <<- 0 
  x <<- x + 1 
  getNext() 
  setOutput(0, x) 
  outputResult() 
}

Ici, l'opérateur d'affectation globale <<- garantit que le même compteur x est disponible dans tous les appels.

Compilation

Ici, l'opérateur d'affectation globale <<- garantit que le même compteur x est disponible dans tous les appels.

/nz/export/ae/utilities/bin/compile_ae --language r \
  --template compile --version 3 --db dev --user nz /tmp/remote.R

Enregistrement

Enregistrez le lanceur comme suit :

/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

En cours d'exécution

L'exécution d'un AE à distance nécessite deux étapes.

Dans un premier temps, lancez l'AE à distance comme suit :

SELECT * FROM TABLE WITH FINAL(REMOTE_RAE_LAUNCH(0));

Un exemple de sortie peut ressembler à ce qui suit :

  AERESULT 
---------------------------------------------------- 
 tran: 91488 session: 16067 data slc: 0 hardware: 0 \ 
 machine: netezza process: 13230 thread: 13230 
(1 row)

Exécutez maintenant la requête de traitement des données proprement dite :

SELECT * FROM TABLE WITH FINAL(remote_rae(0));
 CNT
-----
 1
(1 row) 

Les appels suivants doivent renvoyer 2, 3, et ainsi de suite, car l'objet global x est incrémenté à chaque fois que l'AE distant est invoqué.

R Language Shapes & Sizer avec AEs à distance

Si le fichier /tmp/remote.R est mis à jour pour inclure les deux dernières lignes de l'exemple de code ci-dessous, l'AE R distant peut être enregistré et exécuté avec TABLE(ANY) comme résultat.

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)

Notez que les nouvelles variables nz.shaper et nz.shaper.list ne sont analysées que si l'UDAP est enregistrée auprès de TABLE(ANY). Par conséquent, il n'est pas nécessaire de modifier le nom du fichier compilé puisque le fichier est écrasé.

La compilation est donc la même que dans le cas de la fonction de tableau à distance. L'enregistrement du lanceur UDX est également le même. Toutefois, l'enregistrement de l'interface de traitement des données a pour signature de sortie TABLE(ANY) et un nom d'UDX différent :

/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
Si l'AE distant invoqué précédemment est toujours en cours d'exécution, il devrait être possible d'y accéder par l'intermédiaire des UDX remote_rae et remote_rae2:
SELECT * FROM TABLE WITH FINAL(remote_rae(0));
 CNT
-----
   4
(1 row)

SELECT * FROM TABLE WITH FINAL(remote_rae2(0));
 VALUE
-------
     5
(1 row)