为什么Text优先于Hive UDF java类

时间:2016-07-20 10:14:26

标签: hive udf

有一个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对象,对吧?所以我们不能重复使用它,对吧?

1 个答案:

答案 0 :(得分:0)

您可以通过调用其中一个set()方法来重用Text实例。例如:

Text t = new Text("hadoop");
t.set("pig");