Buscar..


UDAF significa ejemplo

  • Cree una clase Java que amplíe org.apache.hadoop.hive.ql.exec.hive.UDAF Cree una clase interna que implemente el UDAFEvaluator

  • Implementar cinco métodos.

    • init() : este método inicializa el evaluador y restablece su estado interno. Estamos utilizando la nueva columna () en el código siguiente para indicar que aún no se han agregado valores.
    • iterate() : este método se llama cada vez que se agrega un nuevo valor. El evaluador debe actualizar su estado interno con el resultado de realizar la agregación (estamos haciendo la suma, ver más abajo). Devolvemos true para indicar que la entrada era válida.
    • terminatePartial() : este método se llama cuando Hive desea un resultado para la agregación parcial. El método debe devolver un objeto que encapsule el estado de la agregación.
    • merge() : este método se llama cuando Hive decide combinar una agregación parcial con otra.
    • terminate() : este método se llama cuando se necesita el resultado final de la agregación.
    public class MeanUDAF extends UDAF {
    // Define Logging
    static final Log LOG = LogFactory.getLog(MeanUDAF.class.getName());
    public static class MeanUDAFEvaluator implements UDAFEvaluator {
    /**
     * Use Column class to serialize intermediate computation
     * This is our groupByColumn
     */
    public static class Column {
     double sum = 0;
     int count = 0;
     }
    private Column col = null;
    public MeanUDAFEvaluator() {
     super();
     init();
     }
    // A - Initalize evaluator - indicating that no values have been
    // aggregated yet.
    public void init() {
     LOG.debug("Initialize evaluator");
     col = new Column();
     }
    // B- Iterate every time there is a new value to be aggregated
     public boolean iterate(double value) throws HiveException {
     LOG.debug("Iterating over each value for aggregation");
     if (col == null)
     throw new HiveException("Item is not initialized");
     col.sum = col.sum + value;
     col.count = col.count + 1;
     return true;
     }
    // C - Called when Hive wants partially aggregated results.
     public Column terminatePartial() {
     LOG.debug("Return partially aggregated results");
     return col;
     }
     // D - Called when Hive decides to combine one partial aggregation with another
     public boolean merge(Column other) {
     LOG.debug("merging by combining partial aggregation");
     if(other == null) {
     return true;
     }
     col.sum += other.sum;
     col.count += other.count;
     return true; 
    }
     // E - Called when the final result of the aggregation needed.
     public double terminate(){
     LOG.debug("At the end of last record of the group - returning final result"); 
     return col.sum/col.count;
     }
     }
    }


    hive> CREATE TEMPORARY FUNCTION <FUNCTION NAME> AS 'JAR PATH.jar';
    hive> select id, mean_udf(amount) from table group by id;


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow