我的在hive中傳的型別是hive中的陣列
uj5u.com熱心網友回復:
當然可以了~我看是你的udf寫的有問題吧.你傳的array <int> 怎么看報錯提示的是要傳入struct型別啊?uj5u.com熱心網友回復:
在給你個demo吧.用于得到資料里最大的一個值
package cn.com.diditaxi.hive.cf;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDFUtils;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
import org.apache.hive.pdk.HivePdkUnitTest;
import org.apache.hive.pdk.HivePdkUnitTests;
/**
* GenericUDF Class for SQL construct "greatest(value1, value2, value3, ....)".
* Oracle's CREATEST returns the greatest of the list of one or more expressions.
*
*/
@Description(name = "greatest", value = "_FUNC_(value1, value2, value3, ....) " +
"- Returns the greatest value in the list.",
extended = "Example:\n" + " > SELECT _FUNC_(2, 5, 12, 3) FROM src;\n 12")
@HivePdkUnitTests(setup = "create table dual_data (i int); "
+ "insert overwrite table dual_data select 1 from dual limit 1;",
cleanup = "drop table if exists dual_data;",
cases = {
@HivePdkUnitTest(query = "SELECT nexr_greatest(2, 5, 12, 3) " +
"FROM dual_data;", result = "12"),
@HivePdkUnitTest(query = "SELECT nexr_greatest('2', '5', '12', '3') " +
"FROM dual_data;", result = "5"),
@HivePdkUnitTest(query = "SELECT nexr_greatest('apples', 'oranges', 'bananas') " +
"FROM dual_data;", result = "oranges") })
public class GenericUDFGreatest extends GenericUDF {
private ObjectInspector[] argumentOIs;
private GenericUDFUtils.ReturnObjectInspectorResolver returnOIResolver;
@Override
public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
for (int i = 0; i < arguments.length; i++) {
if (arguments[i].getCategory() != ObjectInspector.Category.PRIMITIVE) {
throw new UDFArgumentTypeException(i, "Only primitive type arguments are accepted but "
+ arguments[i].getTypeName() + " is passed.");
}
}
argumentOIs = arguments;
returnOIResolver = new GenericUDFUtils.ReturnObjectInspectorResolver(true);
for (int i = 0; i < arguments.length; i++) {
if (!returnOIResolver.update(arguments[i])) {
throw new UDFArgumentTypeException(i, "The value of return should have the same type: \""
+ returnOIResolver.get().getTypeName() +
"\" is expected but \"" + arguments[i].getTypeName()
+ "\" is found");
}
}
return returnOIResolver.get();
}
@Override
public Object evaluate(DeferredObject[] fields) throws HiveException {
Object greatestObject = null;
ObjectInspector greatestOI = null;
for (int i = 0; i < fields.length; i++) {
Object fieldObject = fields[i].get();
if (greatestObject == null) {
greatestObject = fieldObject;
greatestOI = argumentOIs[i];
continue;
}
if (ObjectInspectorUtils.compare(greatestObject, greatestOI, fieldObject, argumentOIs[i]) <= 0) {
greatestObject = fieldObject;
greatestOI = argumentOIs[i];
}
}
return returnOIResolver.convertIfNecessary(greatestObject, greatestOI);
}
@Override
public String getDisplayString(String[] children) {
StringBuilder sb = new StringBuilder();
sb.append("greatest (");
for (int i = 0; i < children.length - 1; i++) {
sb.append(children[i]).append(", ");
}
sb.append(children[children.length - 1]).append(")");
return sb.toString();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/65973.html
標籤:Spark
上一篇:hive連接不上mysql
