java – 从单个Hive UDF创建多个列
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 从单个Hive UDF创建多个列,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2623字,纯文字阅读大概需要4分钟。
内容图文
![java – 从单个Hive UDF创建多个列](/upload/InfoBanner/zyjiaocheng/787/85209c1e52fa4cf8946884588a2de27a.jpg)
我正在使用Amazon EMR和Hive 0.11.我正在尝试创建一个Hive UDF,它将从一个UDF调用返回多个列.
例如,我想调用类似下面的UDF并返回几个(命名)列.
SELECT get_data(columnname) FROM table;
我无法找到完成此文档的文档,但是听说如果使用Generic UDF则可以.有没有人知道需要从evaluate()方法返回什么才能工作?
解决方法:
我只是使用GenericUDTF.在编写GenericUDTF的udf扩展后,你的udtf应该实现两个重要的方法:初始化和评估.
>在初始化中,您可以检查参数类型并设置返回对象类型.
例如,使用ObjectInspectorFactory.getStandardStructObjectInspector,可以使用structFieldNames参数的名称和structFieldObjectInspectors中的列值类型指定输出列.输出列大小是structFieldNames列表的大小.
有两种类型系统:java和hadoop. java的ObjectInspector是带有javaXXObjectInspector的begein,否则它以writableXXObjectInspector开头.
>在过程中,它类似于常见的udf.除此之外,您应该使用从initialize()保存的ObjectInspector将Object转换为具体值,如String,Integer等.调用??转发函数输出一行.在行对象forwardColObj中,您可以指定列对象.
以下是一个简单的例子:
public class UDFExtractDomainMethod extends GenericUDTF {
private static final Integer OUT_COLS = 2;
//the output columns size
private transient Object forwardColObj[] = new Object[OUT_COLS];
private transient ObjectInspector[] inputOIs;
/**
*
* @param argOIs check the argument is valid.
* @return the output column structure.
* @throws UDFArgumentException
*/
@Override
public StructObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException {
if (argOIs.length != 1 || argOIs[0].getCategory() != ObjectInspector.Category.PRIMITIVE
|| !argOIs[0].getTypeName().equals(serdeConstants.STRING_TYPE_NAME)) {
throw new UDFArgumentException("split_url only take one argument with type of string");
}
inputOIs = argOIs;
List<String> outFieldNames = new ArrayList<String>();
List<ObjectInspector> outFieldOIs = new ArrayList<ObjectInspector>();
outFieldNames.add("host");
outFieldNames.add("method");
outFieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
//writableStringObjectInspector correspond to hadoop.io.Text
outFieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
return ObjectInspectorFactory.getStandardStructObjectInspector(outFieldNames, outFieldOIs);
}
@Override
public void process(Object[] objects) throws HiveException {
try {
//need OI to convert data type to get java type
String inUrl = ((StringObjectInspector)inputOIs[0]).getPrimitiveJavaObject(objects[0]);
URI uri = new URI(inUrl);
forwardColObj[0] = uri.getHost();
forwardColObj[1] = uri.getRawPath();
//output a row with two column
forward(forwardColObj);
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
@Override
public void close() throws HiveException {
}
}
内容总结
以上是互联网集市为您收集整理的java – 从单个Hive UDF创建多个列全部内容,希望文章能够帮你解决java – 从单个Hive UDF创建多个列所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。