美文网首页
Hive中UDTF的实现方式调研

Hive中UDTF的实现方式调研

作者: 分裂四人组 | 来源:发表于2019-04-01 14:20 被阅读0次

简单UDTF的实现

实现基于切割字符串并生成多行数据。

package com.alipay.mbaprod.spark.udtf;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.google.common.annotations.VisibleForTesting;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.ql.exec.MapredContext;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde.serdeConstants;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

public class SimpleUDTF extends GenericUDTF {
  private PrimitiveObjectInspector stringOI = null;

  @Override
  public void configure(MapredContext context) {
    super.configure(context);
    Configuration conf = context.getJobConf();
  }

  @Override
  public StructObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException {
    if (args.length != 1) {
      throw new UDFArgumentException("SimpleUDTF() should have 1 arguments");
    }

    for (int i = 0; i < args.length; ++i) {
      if (args[i].getCategory() != ObjectInspector.Category.PRIMITIVE ||
          !args[i].getTypeName().equals(serdeConstants.STRING_TYPE_NAME)) {
        throw new UDFArgumentException("SimpleUDTF()'s arguments have to be string type");
      }
    }

    stringOI = (PrimitiveObjectInspector) args[0];

    List<String> fieldNames = new ArrayList<String>(2);
    List<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>(2);

    fieldNames.add("col1");
    fieldNames.add("col2");
    fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
    fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
    return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
  }

  @VisibleForTesting
  public List<Object[]> processInputRecord(String id){
    ArrayList<Object[]> result = new ArrayList<Object[]>();
    // ignoring null or empty input
    if (id == null || id.isEmpty()) {
      return result;
    }
    String[] lines = id.split("\n");
    for (String line : lines) {
      String[] tokens = line.trim().split("\\s+");
      if (tokens.length == 2){
        result.add(new Object[] { tokens[0], tokens[1]});
      } else if (tokens.length == 3){
        result.add(new Object[] { tokens[0], tokens[1]});
        result.add(new Object[] { tokens[0], tokens[2]});
      }
    }
    return result;
  }

  @Override
  public void process(Object[] args) throws HiveException {
    final String id = stringOI.getPrimitiveJavaObject(args[0]).toString();
    List<Object[]> results = processInputRecord(id);
    Iterator<Object[]> it = results.iterator();
    while (it.hasNext()) {
      Object[] r = it.next();
      forward(r);
    }
  }

  @Override
  public void close() throws HiveException {
    // TODO Auto-generated method stub
  }
}

相关文章

  • Hive中UDTF的实现方式调研

    简单UDTF的实现 实现基于切割字符串并生成多行数据。

  • hive积累大全

    此篇内容:hive自定义函数UDF、UDTF,压缩存储方式,hive优化、hive实际编程SQL中的if表达式用法...

  • Hive的Transform和UDF

    UDTF Hive中UDTF编写和使用 UDAF Hive udaf开发入门和运行过程详解 Hive通用型自定义聚...

  • HIVE UDTF 自定义函数

    HIVE UDTF 自定义函数 关键词:HIVE UDTF 开发 实例Hive运行用户自定义函数对数据信息处理,...

  • Hive中UDAF的实现方式调研

    UDAF在Hive中实现主要有两种,类似于UDF: 继承org.apache.hadoop.hive.ql.exe...

  • Hive-UDTF

    UDTF 上一篇介绍了基础的UDF——UDF和GenericUDF的实现,这一篇将介绍更复杂的用户自定义表生成函数...

  • hive 解析 json 字符串

    json_tuple (推荐用这个) json_tuple udtf 功能是在 hive 0.7 版本之后加入的,...

  • Hive UDF、UDAF、UDTF

    [参考link][参考link][参考link][参考link][参考link] -1- hive UDF(Use...

  • 【Hive】UDTF之explode

    业务理解 业务需求 创建表 直接使用explode报错 explode炸开之后代表一张表 latern view加...

  • 大数据知识点总结

    Hive: 分区表有哪几类 Hive中追加导入数据的4种方式是什么? Hive中到处数据有几种方式?如何导出数据 ...

网友评论

      本文标题:Hive中UDTF的实现方式调研

      本文链接:https://www.haomeiwen.com/subject/gfidbqtx.html