gpt4 book ai didi

java - 从单个 Hive UDF 创建多个列

转载 作者:可可西里 更新时间:2023-11-01 14:22:30 35 4
gpt4 key购买 nike

我正在使用 Amazon EMR 和 Hive 0.11。我正在尝试创建一个 Hive UDF,它将从一个 UDF 调用返回多个列。

例如,我想像下面这样调用一个 UDF,并返回几个(命名的)列。

SELECT get_data(columnname) FROM table;

我很难找到有关此操作的文档,但听说如果使用通用 UDF 是可能的。有谁知道 evaluate() 方法需要返回什么才能工作?

最佳答案

我只是使用 GenericUDTF。在你编写了 GenericUDTF 的 udf 扩展之后,你的 udtf 应该实现两个重要的方法:初始化和评估。

  • 在初始化中,您可以检查参数类型并设置返回对象类型。例如,使用 ObjectInspectorFactory.getStandardStructObjectInspector,您可以使用 structFieldNames 参数中的名称和 structFieldObjectInspectors 中的列值类型来指定输出列。输出列的大小是 structFieldNames 列表的大小。有两种类型的系统:java和hadoop。 java的ObjectInspector以javaXXObjectInspector开头,否则以writableXXObjectInspector开头。
  • 在处理上,与普通的udf类似。除此之外,您应该使用从 initialize() 保存的 ObjectInspector 将 Object 转换为具体值,如 String、Integer 等。调用 forward 函数输出一行。在行对象 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 创建多个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25982163/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com