Hive 为什么在配置单元UDF java类中文本优先于字符串

Hive 为什么在配置单元UDF java类中文本优先于字符串,hive,udf,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) {

有一个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)
也同样有效。但是,通过使用文本,我们可以利用对象重用, 这可以带来效率节约,因此这通常是首选。 有人能告诉我为什么文本是首选的吗?为什么我们可以通过使用文本来利用对象重用。在配置单元中执行以下命令时:

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

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

通过对文本实例调用set()方法之一,可以重用该实例。例如:

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

通过对文本实例调用set()方法之一,可以重用该实例。例如:

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

看看这个文本是可变的,你可以设置新值,重用对象看看这个文本是可变的,你可以设置新值,重用对象你的意思是文本是可变的,但是字符串不是,所以我们可以重用它,对吗?当我们在表列中使用它时,通过这种方式我们可以使用evaluate来处理很多行,但是结果只创建了一次,strip对象也创建了一次,对吗?你的意思是文本是可变的,但字符串不是,所以我们可以重用它,对吗?当我们在表列中使用它时,通过这种方式我们可以使用evaluate来处理许多行,但是结果只创建一次,strip对象也创建一次,对吗?