为什么 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");
有一个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");