package brickhouse.udf.collect; /** * Copyright 2012 Klout, Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **/ import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; import org.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils; import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector; import java.util.List; /** * Append an object to the end of an Array */ public class AppendArrayUDF extends GenericUDF { private ListObjectInspector listInspector; private PrimitiveObjectInspector listElemInspector; private boolean returnWritables; private PrimitiveObjectInspector primInspector; @Override public Object evaluate(DeferredObject[] args) throws HiveException { List objList = listInspector.getList(args[0].get()); Object objToAppend = args[1].get(); Object[] res = new Object[objList.size() + 1]; for (int i = 0; i < objList.size(); i++) { Object o = objList.get(i); res[i] = returnWritables ? listElemInspector.getPrimitiveWritableObject(o) : listElemInspector.getPrimitiveJavaObject(o); } res[res.length - 1] = returnWritables ? primInspector.getPrimitiveWritableObject(objToAppend) : primInspector.getPrimitiveJavaObject(objToAppend); return res; } @Override public String getDisplayString(String[] args) { return "append_array(" + args[0] + ", " + args[1] + ")"; } @Override public ObjectInspector initialize(ObjectInspector[] params) throws UDFArgumentException { try { listInspector = (ListObjectInspector) params[0]; listElemInspector = (PrimitiveObjectInspector) listInspector.getListElementObjectInspector(); primInspector = (PrimitiveObjectInspector) params[1]; if (listElemInspector.getPrimitiveCategory() != primInspector.getPrimitiveCategory()) { throw new UDFArgumentException( "append_array expects the list type to match the type of the value being appended"); } returnWritables = listElemInspector.preferWritable(); return ObjectInspectorFactory.getStandardListObjectInspector( ObjectInspectorUtils.getStandardObjectInspector(listElemInspector)); } catch (ClassCastException e) { throw new UDFArgumentException("append_array expects a list as the first argument and a primitive " + "as the second argument and the list type to match the type of the value being appended"); } } }