ApplyDriver Versión 2

El código de esta sección se guarda en un archivo llamado ApplyDriverV2.java.

Código

Esta nueva versión del controlador de aplicación utiliza variables de entorno para determinar a qué función llamar (OPERATION o RESULT). También utiliza una variable de entorno para determinar si se emite información de diagnóstico. Se trata de un EA local únicamente.

// ApplyDriverV2.java
package org.netezza.education;

import org.netezza.ae.*;

public class ApplyDriverV2 {
    public static final void main(String [] args) {
        NzaeFactory factory = NzaeFactory.Source.getFactory();
 
        if (factory.isLocal()) {
            NzaeInitialization init = new NzaeInitialization();
            Nzae ae = factory.getLocalFunctionApi(init);

            try {
                // determine which function is being invoked
                String whichFunction =
                    ae.getEnvironment().getValue("APPLY_FUNCTION");
                if (whichFunction == null) {
                    ae.userError(
                        "missing APPLY_FUNCTION " +
                        "environment variable");
                    return;
                }
                String printInfo =
                    ae.getEnvironment().getValue("APPLY_INFO");
                if (printInfo != null
                        && printInfo.equalsIgnoreCase("true")) {
                    ApplyUtil.printMetadata(ae);
                    ApplyUtil.printRuntime(ae);
                    ApplyUtil.printSharedLibraries(ae);
                    ApplyUtil.printEnvironment(ae);
                }

                if (whichFunction.equals("OPERATION")) {
                    ApplyOperation.runAe(ae);
                } else if (whichFunction.equals("RESULT")) {
                    ApplyResult.runAe(ae);
                } else {
                    ae.userError("unexpected value for " +
                        "environment variable APPLY_FUNCTION");
                }
            } finally {
                ae.close();
            }
        } else {
            throw new RuntimeException("Expecting Local AE only");
        }
    }
}

Una compilación

$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language java --template compile
--version 3 --db dev \
"ApplyDriverV2.java ApplyOperation.java ApplyResult.java ApplyUtil.java

Registro como función escalar applyOperationV2Sf

Este ejemplo establece la variable de entorno APPLY_FUNCTION AE específica de la aplicación en la función OPERATION para que el AE aplique una operación a las columnas de una fila.

$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language java --template udf
--version 3 --db dev \
     --sig "applyOperationV2Sf(varargs)" --return double \
     --define java_class=org.netezza.education.ApplyDriverV2 --level 1 \
     --environment "'APPLY_FUNCTION'='OPERATION'" \
     --environment "'APPLY_INFO'='true'" \
     --environment "'NZAE_LOG_DIR'='/nz/export/ae/log'"

Registro como función de tabla applyOperationV2Tf

Este ejemplo también establece la variable de entorno APPLY_FUNCTION AE específica de la aplicación en la función OPERATION, como se ha indicado anteriormente. Utiliza una invocación de función de tabla.

$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language java --template udtf
--version 3 --db dev \
     --sig "applyOperationV2Tf(varargs)" --return "table(result double)" \
     --define java_class=org.netezza.education.ApplyDriverV2 --level 1 \
     --environment "'APPLY_FUNCTION'='OPERATION'" \
     --environment "'APPLY_INFO'='true'" \
     --environment "'NZAE_HOST_ONLY_NZAE_SPIN_FILE_NAME'='/tmp/spin_ae.on'" \
     --environment "'NZAE_LOG_DIR'='/nz/export/ae/log'"

Registro como tabla Función applyResultV2

Este ejemplo establece la variable de entorno APPLY_FUNCTION AE específica de la aplicación en la función RESULT para que el AE aplique una operación a la segunda columna de cada fila.

$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language java --template udtf
--version 3 --db dev \
     --sig "applyResultV2(varchar(16), double)" \
     --return "table(result double)" \
     --define java_class=org.netezza.education.ApplyDriverV2 --level 1 \
     --noparallel --environment "'APPLY_FUNCTION'='RESULT'" \
     --environment "'APPLY_INFO'='true'" \
     --environment "'NZAE_LOG_DIR'='/nz/export/ae/log'"

Ejecución como función de tabla applyResultV2

SELECT result FROM edutestdata, TABLE WITH FINAL(applyResultV2('sum', f1))
     WHERE color = 'red';
 RESULT
--------
    101

Ejecución como applyOperationV2Tf y applyResultV2

La función SQL applyOperationV2Tf aplica el operador de suma a las columnas de una fila y luego transmite el resultado a la función SQL applyResultV2, que aplica la operación de suma a la segunda columna de cada fila.

SELECT re.result FROM edutestdata,
     TABLE WITH FINAL(applyOperationV2Tf('+', f1, f2, f3, f4)) op,
     TABLE WITH FINAL(applyResultV2('sum', op.result)) re
     WHERE color = 'red';
 RESULT
--------
    413

Puede crear una versión alternativa de la muestra ApplyDriverV2, que utiliza código Java de terceros y de código abierto con un AE de Java. Esta versión alternativa de ApplyDriverV2 utiliza un archivo JAR y se despliega en un archivo JAR. Llama al método principal de ApplyDriverV2. Por lo demás, la funcionalidad del AE es la misma.

Adquisición del archivo JAR de código abierto

Antes de poder ejecutar este ejemplo, debe descargar e instalar archivos base64 de terceros. Para recuperar y compilar el archivo JAR de código abierto de ejemplo, realice los siguientes pasos:
  1. Descargue el archivo zip de la fuente Java de http://iharder.sourceforge.net/current/java/base64/
  2. Extraiga el contenido en un directorio Linux vacío.
    unzip -j Base64-v<version_number>.zip
  3. Compilar Base64.java:
    [~/installs/base64]$javac Base64.java
  4. Para listar el contenido del archivo JAR, introduzca el siguiente comando:
    [~/installs/base64]$jar tf Base64.jar
    META-INF/ 
    META-INF/MANIFEST.MF 
    Base64$1.class 
    Base64.class 
    Base64$InputStream.class 
    Base64$OutputStream.class
  5. Cree el archivo JAR:
    [~/installs/base64]$jar cf Base64.jar *.class
  6. Despliegue el archivo JAR recién creado:
    /nz/export/ae/utilities/bin/compile_ae --language java --version 3 --db dev \ 
     --template deploy base64.jar

El archivo JAR ya está listo para ser utilizado con un Java AE.

Código para JarApplyDriverV2.java

El siguiente AE utiliza el recién desplegado base64.jar:

// JarApplyDriverV2.java
// demonstrates use of 3rd party jar file
package org.netezza.education;

import java.io.IOException;
// from http://iharder.sourceforge.net/current/java/base64/
import sourceforge.iharder.Base64;

public class JarApplyDriverV2 {
    public static final void main(String [] args) {
        try {
            double value = 100;
            String result = Base64.encodeObject(value);
            System.out.println("JarApplyDriverV2: "
                + result);
        } catch (IOException e) {
            System.err.println("JarApplyDriverV2: "
                + e.getMessage());
        }

        ApplyDriverV2.main(args);
    }
}

Compilar arApplyDriverV2.java

Este ejemplo muestra cómo compilar utilizando un archivo JAR de terceros con el parámetro --linkargs y cómo compilar a un archivo JAR utilizando el parámetro -exe. Dado que el ejemplo se basa en el JAR de terceros base64.jar, que se desplegó previamente en la base de datos dev, este AE debe utilizar la misma base de datos. (La ruta para el base64.jar jar está definida por la ruta de la opción -linkargs )

$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language java --template compilejar
--version 3 --db dev \
     --linkargs /nz/export/ae/applications/dev/admin/java/base64.jar \
     --exe apply.jar \
     "JarApplyDriverV2.java ApplyDriverV2.java ApplyOperation.java \
     ApplyResult.java ApplyUtil.java"

Registro como función escalar applyOperationV2SfJar

Este ejemplo muestra cómo registrarse para utilizar una clase dentro de un archivo JAR utilizando la variable de entorno AE NZAE_APPEND_CLASSPATH. Debido a que el ejemplo se basa en el JAR de terceros base64.jar, y el archivo jar AE apply.jar, ambos previamente desplegados en la base de datos dev, este AE debe utilizar la misma base de datos. La variable de entorno NZAE_APPEND_CLASSPATH permite establecer la variable de entorno java CLASSPATH (para localizar el base64.jar previamente desplegado). Observe el uso de -exe apply.jar, que garantiza que apply.jar también se añade a CLASSPATH. (Esto supone que los pasos de compilación y registro están ambos en la misma base de datos, en este caso dev)

$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language java --template udf
--version 3 --db dev \
     --sig "applyOperationV2SfJar(varargs)" --return double \
     --define java_class=org.netezza.education.JarApplyDriverV2 \
     --exe apply.jar --level 1 --environment "'APPLY_FUNCTION'='OPERATION'" \
     --environment "'APPLY_INFO'='true'" \
     --environment "'NZAE_LOG_DIR'='/nz/export/ae/log'" \
     --environment "'NZAE_APPEND_CLASSPATH'=\
     '/nz/export/ae/applications/dev/admin/java/base64.jar'"

Registro como función de tabla applyOperationV2TfJar

Este ejemplo muestra cómo registrarse para utilizar una clase dentro de un archivo JAR utilizando la variable de entorno AE NZAE_APPEND_CLASSPATH, como se ha indicado anteriormente. Utiliza una invocación de función de tabla.

$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language java --template udtf
--version 3 --db dev \
     --sig "applyOperationV2TfJar(varargs)" --return "table(result double)" \
     --define java_class=org.netezza.education.JarApplyDriverV2 \
     --exe apply.jar --level 1 \
     --environment "'APPLY_FUNCTION'='OPERATION'" \
     --environment "'APPLY_INFO'='true'" \
     --environment "'NZAE_LOG_DIR'='/nz/export/ae/log'" \
     --environment "'NZAE_APPEND_CLASSPATH'=\
     '/nz/export/ae/applications/dev/admin/java/base64.jar'"

Registro como función escalar applyResutV2Jar

Este ejemplo muestra cómo registrarse para utilizar una clase dentro de un archivo JAR utilizando la variable de entorno AE NZAE_APPEND_CLASSPATH.

$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language java --template udtf
--version 3 --db dev \
     --sig "applyResultV2Jar(varchar(16), double)" 
     --return "table(result double)" \
     --define java_class=org.netezza.education.JarApplyDriverV2 \
     --exe apply.jar --level 1 --noparallel \
     --environment "'APPLY_FUNCTION'='RESULT'" \
     --environment "'APPLY_INFO'='true'" \
     --environment "'NZAE_LOG_DIR'='/nz/export/ae/log'" \
     --environment "'NZAE_APPEND_CLASSPATH'=\
     '/nz/export/ae/applications/dev/admin/java/base64.jar'"

Ejecutando JarApplyDriverV2.java

SELECT re.result FROM edutestdata,
     TABLE WITH FINAL(applyOperationV2TfJar('+', f1, f2, f3, f4)) op,
     TABLE WITH FINAL(applyResultV2Jar('sum', op.result)) re
     WHERE color = 'red';
RESULT
-------
   413