有一个UDF java类,如下所示:
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class Strip extends UDF {
private Text result = new Text();
public Text evaluate(Text str) {
if (str == null) {
return null;
}
result.set(StringUtils.strip(str.toString()));
return result;
}
public Text evaluate(Text str, String stripChars) {
if (str == null) {
return null;
}
result.set(StringUtils.strip(str.toString(), stripChars));
return result;
}
}
Hive实际上支持Java UDF中的原语(以及一些其他类型,例如java.util.List和 java.util.Map),所以签名如下:
public String evaluate(String str)
同样有效。但是,通过使用Text,我们可以利用对象重用, 这可以带来效率节省,因此这是一般的首选。 有人能告诉我文本首选的原因吗?为什么我们可以通过使用Text来利用对象重用。当我们在Hive中执行以下命令时:
hive> SELECT strip(' bee ') FROM dummy;
之后我们使用Strip函数执行另一个命令,然后再次创建Strip对象,对吧?所以我们不能重复使用它,对吧?
答案 0 :(得分:0)
您可以通过调用其中一个set()方法来重用Text实例。例如:
Text t = new Text("hadoop");
t.set("pig");