hive
Пользовательские агрегированные функции (UDAF)
Поиск…
Пример UDAF
Создайте класс Java, который расширяет
org.apache.hadoop.hive.ql.exec.hive.UDAF
Создайте внутренний класс, который реализуетUDAFEvaluator
Внедрение пяти методов
-
init()
- Этот метод инициализирует оценщика и сбрасывает его внутреннее состояние. Мы используем новый столбец () в приведенном ниже коде, чтобы указать, что все значения еще не были агрегированы. -
iterate()
- этот метод вызывается каждый раз, когда создается новое значение для агрегирования. Оценщик должен обновить свое внутреннее состояние в результате выполнения агрегации (мы делаем сумму - см. Ниже). Мы возвращаем true, чтобы указать, что вход был действительным. -
terminatePartial()
- этот метод вызывается, когда Hive хочет получить результат для частичной агрегации. Метод должен возвращать объект, который инкапсулирует состояние агрегации. -
merge()
- этот метод вызывается, когда Hive решает объединить одну частичную агрегацию с другой. -
terminate()
- этот метод вызывается, когда необходим конечный результат агрегации.
-
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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow