为什么 Text 在 Hive UDF 中优于 String java class

Why Text is preferred than String in Hive UDF java class

有一个UDF java class如下所示:

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 的原因吗?为什么我们可以通过使用 Text 来利用对象重用。当我们在 Hive 中执行如下命令时:

hive> SELECT strip(' bee ') FROM dummy;

之后我们使用那个Strip函数执行另一个命令,然后再次创建Strip对象,对吧?所以我们不能重用它,对吧?

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

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