package com.livingsocial.hive.udf;
import com.livingsocial.hive.Utils;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDAFMax;
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.io.Text;
@Description(
name = "smax",
value = "_FUNC_(expr) - Returns the maximum value of expr, treating strings as dates"
)
public class SMax extends GenericUDAFMax {
static public class SMaxStringEvaluator implements UDAFEvaluator {
private Text mMax;
private boolean mEmpty;
public SMaxStringEvaluator() {
super();
init();
}
public void init() {
mMax = null;
mEmpty = true;
}
public boolean iterate(Text o) {
if (o != null) {
if (mEmpty) {
mMax = new Text(o);
mEmpty = false;
} else if (Utils.stringToTimestamp(mMax.toString()) < Utils.stringToTimestamp(o.toString())) {
mMax.set(o);
}
}
return true;
}
public Text terminatePartial() {
return mEmpty ? null : mMax;
}
public boolean merge(Text o) {
return iterate(o);
}
public Text terminate() {
return mEmpty ? null : mMax;
}
}
}