之前说过HIVE,UDF(User-Defined-Function)函数的编写和使用,现在来看看UDTF的编写和使用。

1. UDTF介绍

UDTF(User-Defined Table-Generating Functions) 用来解决 输入一行输出多行(On-to-many maping) 的需求。

2. 编写自己需要的UDTF

继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF,实现initialize, process, close三个方法。

UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型)。

初始化完成后,会调用process方法,真正的处理过程在process函数中,在process中,每一次forward()调用产生一行;如果产生多列可以将多个列的值放在一个数组中,然后将该数组传入到forward()函数。

最后close()方法调用,对需要清理的方法进行清理。

下面是我写的一个用来切分”key:value;key:value;”这种字符串,返回结果为key, value两个字段。供参考:

  1. package com.hadoop.hive.udtf;
  2.  
  3. import java.util.ArrayList;
  4.  
  5. import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
  6. import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
  7. import org.apache.hadoop.hive.ql.metadata.HiveException;
  8. import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
  9. import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
  10. import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
  11. import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
  12. import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
  13.  
  14. public class UDTFExplode extends GenericUDTF {
  15.  
  16. @Override
  17. public void close() throws HiveException {
  18. // TODO Auto-generated method stub
  19.  
  20. }
  21.  
  22. @Override
  23. public void process(Object[] args) throws HiveException {
  24. // TODO Auto-generated method stub
  25. String input = args[0].toString();
  26. String[] test = input.split(";");
  27. for (int i = 0; i < test.length; i++) {
  28. try {
  29. String[] result = test[i].split(":");
  30. forward(result);
  31. } catch (Exception e) {
  32. continue;
  33. }
  34. }
  35.  
  36. }
  37.  
  38. @Override
  39. public StructObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException {
  40. if (args.length != 1) {
  41. throw new UDFArgumentLengthException("ExplodeMap takes only one argument");
  42. }
  43. if (args[0].getCategory() != ObjectInspector.Category.PRIMITIVE) {
  44. throw new UDFArgumentException("ExplodeMap takes string as a parameter");
  45. }
  46.  
  47. ArrayList<String> fieldNames = new ArrayList<String>();
  48. ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();
  49. fieldNames.add("col1");
  50. fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
  51. fieldNames.add("col2");
  52. fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
  53.  
  54. return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
  55. }
  56.  
  57. }

3.使用方法

将程序打成JAR包,然后上传服务器。添加UDF函数:

UDTF有两种使用方法,一种直接放到select后面,一种和lateral view一起使用。

1:直接select中使用

  1. select split_test('asd:123\;rtrt:3445\;vbvx:6787') as (col1,col2) from finance.dual;

需要注意的是UDTF不可以添加其他字段使用,不可以嵌套调用,不可以和group by/cluster by/distribute by/sort by一起使用

2:和lateral view一起使用

  1. select '1', mytable.col1, mytable.col2 from finance.dual lateral view split_test('asd:123\;rtrt:3445\;vbvx:6787') as (col1,col2) mytable as col1, col2;

执行过程相当于单独执行了两次抽取,然后union到一个表里。

hive UDTF函数的更多相关文章

  1. Hadoop3集群搭建之——hive添加自定义函数UDTF

    上篇: Hadoop3集群搭建之——虚拟机安装 Hadoop3集群搭建之——安装hadoop,配置环境 Hadoop3集群搭建之——配置ntp服务 Hadoop3集群搭建之——hive安装 Hadoo ...

  2. Hadoop3集群搭建之——hive添加自定义函数UDTF (一行输入,多行输出)

    上篇: Hadoop3集群搭建之——虚拟机安装 Hadoop3集群搭建之——安装hadoop,配置环境 Hadoop3集群搭建之——配置ntp服务 Hadoop3集群搭建之——hive安装 Hadoo ...

  3. hive自定义UDTF函数叉分函数

    hive自定义UDTF函数叉分函数 1.介绍 从聚合体日志中需要拆解出来各子日志数据,然后单独插入到各日志子表中.通过表生成函数完成这一过程. 2.定义ForkLogUDTF 2.1 HiveUtil ...

  4. hive自定义函数UDF UDTF UDAF

    Hive 自定义函数 UDF UDTF UDAF 1.UDF:用户定义(普通)函数,只对单行数值产生作用: UDF只能实现一进一出的操作. 定义udf 计算两个数最小值 public class Mi ...

  5. hive -- 自定义函数和Transform

    hive -- 自定义函数和Transform UDF操作单行数据, UDAF:聚合函数,接受多行数据,并产生一个输出数据行 UDTF:操作单个数据 使用udf方法: 第一种: add jar xxx ...

  6. UDF、UDAF、UDTF函数编写

    一.UDF函数编写 1.步骤 1.继承UDF类 2.重写evalute方法 .继承GenericUDF .实现initialize.evaluate.getDisplayString方法 2.案例 实 ...

  7. Hadoop3集群搭建之——hive添加自定义函数UDF

    上篇: Hadoop3集群搭建之——虚拟机安装 Hadoop3集群搭建之——安装hadoop,配置环境 Hadoop3集群搭建之——配置ntp服务 Hadoop3集群搭建之——hive安装 Hadoo ...

  8. Hive UDTF开发指南

    在这篇文章中,我们将深入了解用户定义表函数(UDTF),该函数的实现是通过继承org.apache.Hadoop.hive.ql.udf.generic.GenericUDTF这个抽象通用类,UDTF ...

  9. 第3节 hive高级用法:13、hive的函数

    4.2.Hive参数配置方式 Hive参数大全: https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties 开 ...

随机推荐

  1. Js获取日期时间及其它操作

    var myDate = new Date();myDate.getYear();        //获取当前年份(2位)myDate.getFullYear();    //获取完整的年份(4位,1 ...

  2. 获取资源ID

    比如,设置一张gif图片的宽高 gif.setShowDimension((int) CommonUtil.getDimen(R.dimen.gif), (int) CommonUtil.getDim ...

  3. tomcat启动中提示 - consider increasing the maximum size of the cache

    tomcat启动过程中提示: org.apache.catalina.webresources.Cache.getResource Unable to add the resource at xxx ...

  4. UVALive 4128 Steam Roller(最短路(拆点,多状态))

    题意:模拟了汽车的行驶过程,边上的权值为全速通过所消耗的时间,而起步(从起点出发的边).刹车(到终点结束的边).减速(即将拐弯的边).加速(刚完成拐弯的边)这四种不能达到全速的情况,消耗的时间为权值* ...

  5. Oracle 创建和使用视图

    一.what(什么是视图?) 1.视图是一种数据库对象,是从一个或者多个数据表或视图中导出的虚表,视图所对应的数据并不真正地存储在视图中,而是存储在所引用的数据表中,视图的结构和数据是对数据表进行查询 ...

  6. #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

    #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)宏的运行机理:1. ( (TYPE *)0 ) 将零转型为TY ...

  7. ASP.NET MVC+Bootstrap个人博客之打造清新分页Helper(三)

    有点另类,分页直接是在后台拼接好html,然后发送到前台的: 1. 分页容器: <div class="pagination"> <ul> //****** ...

  8. Matlab编程实例(4) 相位角与相关系数曲线

    %相位角与相关系数曲线 close all; clear all; Samp1=200;  %设置信号的采样精度 Samp2=200;  %设置相位角p分割精度 A=10;%信号幅值 w=1;%信号角 ...

  9. JAVA和C/C++之间的相互调用。

    在一些Android应用的开发中,需要通过JNI和 Android NDK工具实现JAVA和C/C++之间的相互调用. Java Native Interface (JNI)标准是java平台的一部分 ...

  10. XCode修改工程名注意

    以下文字转载过来,在使用的过程中遇到几个问题 1.需要在 Build phases 里面,检查下 Link Binary With Libraries 以及Compline Sources 2.Bul ...