Hadoop3集群搭建之——hive添加自定义函数UDTF
Posted Flink菜鸟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop3集群搭建之——hive添加自定义函数UDTF相关的知识,希望对你有一定的参考价值。
上篇:
其他配置请参照上篇:Hadoop3集群搭建之——hive添加自定义函数UDF
简述下需求:
系统userid格式如下:
前三位代表国家
接下来三位代表省
再接下来三位代表市
剩下的所以代表 商店
(瞎掰的需求,大意就是要切割字符串)
直接上代码:
/** * Created by venn on 5/20/2018. * SplitString : split string * first 3 string : country * next 3 string : province * next 3 string : city * next all : story */ public class SplitString extends GenericUDTF { /** * add the column name,添加列名,类型。使用的hive-exec 1.2.1,想用2.3.3的,但是不会初始化列名部分 * @param args * @return * @throws UDFArgumentException */ @Override public StructObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException { if (args.length != 1) { throw new UDFArgumentLengthException("ExplodeMap takes only one argument"); } if (args[0].getCategory() != ObjectInspector.Category.PRIMITIVE) { throw new UDFArgumentException("ExplodeMap takes string as a parameter"); } ArrayList<String> fieldNames = new ArrayList<String>(); ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>(); fieldNames.add("userid"); // 第一列将输入字符串原样输出,方便查看 fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector); fieldNames.add("country"); // 第二列为国家 fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector); fieldNames.add("province"); //第三列为省 fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector); fieldNames.add("city"); // 第四列为市 fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector); fieldNames.add("story"); // 第五列商店 fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector); // 返回 return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs); } /** * process the column * @param objects * @throws HiveException */ public void process(Object[] objects) throws HiveException { String[] result = new String[5]; try { /*System.out.println(objects[0].toString()); System.out.println(objects[0] != null); System.out.println(StringUtils.isEmpty(objects[0].toString())); System.out.println(objects[0].toString().length() < 10);*/
// 如果数据不满足要求,返回 0 0 0 0 0
if (objects[0] == null || StringUtils.isEmpty(objects[0].toString()) || objects[0].toString().length() < 10) { result[0] = "0"; result[1] = "0"; result[2] = "0"; result[3] = "0"; result[4] = "0"; } else { result[0] = objects[0].toString(); result[1] = objects[0].toString().substring(0, 3); result[2] = objects[0].toString().substring(3, 6); result[3] = objects[0].toString().substring(6, 9); result[4] = objects[0].toString().substring(9); } // 将数据返回 forward(result); } catch (Exception e) { } } public void close() throws HiveException { } }
hive UDTF函数编有三个部分:
initialize : 初始化列名
process : 处理字符串部分
forward : 返回结果
使用方式请见上篇:Hadoop3集群搭建之——hive添加自定义函数UDF
打包、上传服务器,修改 $HIVE_HOME/bin/.hiverc
添加如下内容: jar包可以添加多个
[hadoop@venn05 bin]$ more .hiverc add jar /opt/hadoop/idp_hd/viewstat/lib/hivefunction-1.0-SNAPSHOT.jar; create temporary function split_area as \'com.venn.udtf.SplitString\';
使用结果如下:
hive> select split_area(userid) from sqoop_test limit 10; OK 87630458181 876 304 581 81 87630457377 876 304 573 77 87630457377 876 304 573 77 87630457172 876 304 571 72 87630457157 876 304 571 57 87630456302 876 304 563 02 87630455552 876 304 555 52 87630455552 876 304 555 52 87630455543 876 304 555 43 87630454571 876 304 545 71
以上是关于Hadoop3集群搭建之——hive添加自定义函数UDTF的主要内容,如果未能解决你的问题,请参考以下文章
Hadoop3集群搭建之——hive添加自定义函数UDFUDTF
基于Hadoop3.1.2集群的Hive3.1.2安装(有不少坑)
hadoop集群搭建(Hadoop 3.1.3 /Hive 3.1.2/Spark 3.0.0)
纯手动搭建大数据集群架构_记录018_RuoYi-Cloud-Plus-master_Kafka集成的自己创建的微服务_实现多主题数据传输---大数据之Hadoop3.x工作笔记0179