importorg.apache.hadoop.hive.ql.exec.Description;importorg.apache.hadoop.hive.ql.exec.UDFArgumentException;importorg.apache.hadoop.hive.ql.metadata.HiveException;importorg.apache.hadoop.hive.ql.udf.generic.GenericUDF;importorg.apache.hadoop.hive.serde2.objectinspector.ListObjectInspector;importorg.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;importorg.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;importorg.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;importorg.apache.hadoop.hive.serde2.objectinspector.primitive.StringObjectInspector;importjava.util.Arrays;/**
* @DATE 2021/4/7
* @Description
*/@Description(
name ="arrContains",
value ="look around a value is one element of an array or not.result is true or false",
extended ="select arrContains(array('a','b','c'),'c');"+"result is true")publicclassTestGenericUDFextendsGenericUDF{//继承GenericUDF类ListObjectInspector loi;StringObjectInspector valueOi;ObjectInspector paramOi;boolean result;//init方法的主要目的是为了初始化输入类型,进行合法化等业务逻辑判断@OverridepublicObjectInspectorinitialize(ObjectInspector[] ois)throwsUDFArgumentException{//初始化输入和输出格式,并判断合法性
loi =(ListObjectInspector) ois[0];
valueOi =(StringObjectInspector) ois[1];
paramOi = loi.getListElementObjectInspector();
result =false;returnPrimitiveObjectInspectorFactory.javaBooleanObjectInspector;}@OverridepublicObjectevaluate(DeferredObject[] dos)throwsHiveException{Object array = dos[0].get();Object value = dos[1].get();int length = loi.getListLength(array);for(int i =0; i < length; i++){Object element = loi.getListElement(array, i);if(value !=null&& value.equals(element)){
result =true;break;}}return result;}@OverridepublicStringgetDisplayString(String[] chis){return"This is arrContains,Hello there!"+Arrays.toString(chis);}}