ApplyDriver Versione 2
Il codice di questa sezione viene salvato in un file chiamato ApplyDriverV2.java
Codice
Questa nuova versione del driver applicativo utilizza le variabili d'ambiente per determinare quale funzione chiamare (OPERAZIONE o RISULTATO). Utilizza anche una variabile d'ambiente per determinare se emettere informazioni diagnostiche. Si tratta di un'AE solo locale.
// 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");
}
}
}
Compilazione
$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language java --template compile
--version 3 --db dev \
"ApplyDriverV2.java ApplyOperation.java ApplyResult.java ApplyUtil.java
Registrazione come funzione scalare applyOperationV2Sf
Questo esempio imposta la variabile d'ambiente APPLY_FUNCTION AE specifica dell'applicazione sulla funzione OPERATION, in modo che l'AE applichi un'operazione alle colonne di una riga.
$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'"
Registrazione come funzione tabella applyOperationV2Tf
Questo esempio imposta anche la variabile d'ambiente APPLY_FUNCTION AE specifica dell'applicazione sulla funzione OPERATION, come sopra. Utilizza un'invocazione di funzione di tabella.
$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'"
Registrazione come tabella Funzione applyResultV2
Questo esempio imposta la variabile d'ambiente APPLY_FUNCTION AE specifica dell'applicazione sulla funzione RESULT, in modo che l'AE applichi un'operazione alla seconda colonna di ogni riga.
$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'"
Esecuzione come tabella Funzione applyResultV2
SELECT result FROM edutestdata, TABLE WITH FINAL(applyResultV2('sum', f1))
WHERE color = 'red';
RESULT
--------
101
Esecuzione come applyOperationV2Tf e applyResultV2
La funzione SQL applyOperationV2Tf applica l'operatore di addizione alle colonne di una riga e poi trasmette il risultato alla funzione SQL applyResultV2, che applica l'operazione di somma alla seconda colonna di ogni riga.
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
È possibile creare una versione alternativa dell'esempio ApplyDriverV2, che utilizza codice Java di terze parti e open source con un AE Java. Questa versione alternativa di ApplyDriverV2 utilizza un file JAR e viene distribuita in un file JAR. Richiama il metodo principale di ApplyDriverV2. Per il resto, la funzionalità dell'AE è la stessa.
Acquisizione del file JAR open source
- Scaricate il file zip del sorgente Java da http://iharder.sourceforge.net/current/java/base64/
- Estrarre il contenuto in una directory Linux vuota.
unzip -j Base64-v<version_number>.zip - Compilare Base64.java:
[~/installs/base64]$javac Base64.java - Per elencare il contenuto del file JAR, digitate il seguente comando:
[~/installs/base64]$jar tf Base64.jar META-INF/ META-INF/MANIFEST.MF Base64$1.class Base64.class Base64$InputStream.class Base64$OutputStream.class - Creare il file JAR:
[~/installs/base64]$jar cf Base64.jar *.class - Distribuire il file JAR appena creato:
/nz/export/ae/utilities/bin/compile_ae --language java --version 3 --db dev \ --template deploy base64.jar
Il file JAR è ora pronto per essere utilizzato con un AE Java.
Codice per JarApplyDriverV2.java
Il seguente AE utilizza la nuova distribuzione 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);
}
}
Compilare arApplyDriverV2.java
Questo esempio mostra come compilare utilizzando un file JAR di terze parti con il parametro --linkargs e come compilare in un file JAR utilizzando il parametro -exe. Poiché l'esempio si basa sul JAR base64.jar di terze parti, che è stato precedentemente distribuito sul database dev, questo AE deve utilizzare lo stesso database. (Il percorso di base64.jar è definito dal percorso dell'opzione -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"
Registrazione come funzione scalare applyOperationV2SfJar
Questo esempio mostra come registrarsi per utilizzare una classe all'interno di un file JAR utilizzando la variabile d'ambiente AE NZAE_APPEND_CLASSPATH. Poiché l'esempio si basa sul JAR base64.jar di terze parti e sul file jar apply.jar dell'AE, entrambi distribuiti in precedenza sul database dev, questo AE deve utilizzare lo stesso database. La variabile d'ambiente NZAE_APPEND_CLASSPATH consente di impostare la variabile d'ambiente java CLASSPATH (per individuare il file base64.jar distribuito in precedenza). Si noti l'uso di -exe apply.jar, che assicura che apply.jar sia aggiunto anche al CLASSPATH. (Questo presuppone che le fasi di compilazione e registrazione siano entrambe nello stesso database, in questo 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'"
Registrazione come tabella Funzione applyOperationV2TfJar
Questo esempio mostra come registrarsi per utilizzare una classe all'interno di un file JAR utilizzando la variabile d'ambiente AE NZAE_APPEND_CLASSPATH, come sopra. Utilizza un'invocazione di funzione di tabella.
$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'"
Registrazione come funzione scalare applyResutV2Jar
Questo esempio mostra come registrarsi per utilizzare una classe all'interno di un file JAR utilizzando la variabile d'ambiente 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'"
Esecuzione di 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