技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 其他 --> HIVE中UDTF编写和使用

HIVE中UDTF编写和使用

浏览:5286次  出处信息

    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方法,对传入的参数进行处理,可以通过forword()方法把结果返回。最后close()方法调用,对需要清理的方法进行清理。
  •     下面是我写的一个用来切分”key:value;key:value;”这种字符串,返回结果为key, value两个字段。供参考:

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

        3. 使用方法

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

        1:直接select中使用:select explode_map(properties) as (col1,col2) from src;

  • 不可以添加其他字段使用:select a, explode_map(properties) as (col1,col2) from src
  • 不可以嵌套调用:select explode_map(explode_map(properties)) from src
  • 不可以和group by/cluster by/distribute by/sort by一起使用:select explode_map(properties) as (col1,col2) from src group by col1, col2
  •     2:和lateral view一起使用:select src.id, mytable.col1, mytable.col2 from src lateral view explode_map(properties) mytable as col1, col2;

  • 此方法更为方便日常使用。执行过程相当于单独执行了两次抽取,然后union到一个表里。
  •     4. 参考文档

        http://wiki.apache.org/hadoop/Hive/LanguageManual/UDF

        http://wiki.apache.org/hadoop/Hive/DeveloperGuide/UDTF

        http://www.slideshare.net/pauly1/userdefined-table-generating-functions

    建议继续学习:

    1. 如何获取hive建表语句    (阅读:6703)
    2. Hive源码解析-之-词法分析器 parser    (阅读:5860)
    3. Hive的入口 -- Hive源码解析    (阅读:4849)
    4. Hive源码解析-之-语法解析器    (阅读:4346)
    5. 用hadoop hive协同scribe log用户行为分析方案    (阅读:4153)
    6. 几个HIVE的streaming    (阅读:3423)
    7. 写好Hive 程序的五个提示    (阅读:3185)
    8. Impala与Hive的比较    (阅读:3016)
    9. Hive 随谈(一)    (阅读:2861)
    10. Hive 随谈(二)    (阅读:2644)
    QQ技术交流群:445447336,欢迎加入!
    扫一扫订阅我的微信号:IT技术博客大学习
    © 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

    京ICP备15002552号-1