hive
User Defined Aggregate Functions (UDAF)
Zoeken…
UDAF betekent voorbeeld
Maak een Java-klasse die
org.apache.hadoop.hive.ql.exec.hive.UDAF
uitbreidt Maak een binnenklasse dieUDAFEvaluator
implementeertImplementeer vijf methoden
-
init()
- Deze methode initialiseert de evaluator en reset de interne status. We gebruiken de nieuwe kolom () in de onderstaande code om aan te geven dat er nog geen waarden zijn verzameld. -
iterate()
- Deze methode wordt elke keer aangeroepen wanneer er een nieuwe waarde is die moet worden geaggregeerd. De evaluator moet zijn interne status bijwerken met het resultaat van het uitvoeren van de aggregatie (we doen de som - zie hieronder). We keren true terug om aan te geven dat de invoer geldig was. -
terminatePartial()
- Deze methode wordt aangeroepen wanneer Hive een resultaat voor de gedeeltelijke aggregatie wil. De methode moet een object retourneren dat de status van de aggregatie inkapselt. -
merge()
- Deze methode wordt aangeroepen wanneer Hive besluit een gedeeltelijke aggregatie met een andere te combineren. -
terminate()
- Deze methode wordt aangeroepen wanneer het uiteindelijke resultaat van de aggregatie nodig is.
-
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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow