`
dacoolbaby
  • 浏览: 1254635 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Hive的UDTF

    博客分类:
  • Hive
阅读更多

Refer to:http://blog.csdn.net/wf1982/article/details/7623708 

 

1.介绍 

UDTF(User-Defined Table-Generating Functions)  用来解决 输入一行输出多行(On-to-many maping) 的需求。同时,也可以解决一列拆分成多列的问题(Hive支持复杂的数据格式,包括List)。

 

2.编写需要的UDTF

1) 继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF。
2) 实现initialize, process, close三个方法
3) UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型)。
初始化完成后,会调用process方法,对传入的参数进行处理,可以通过forword()方法把结果返回。
最后close()方法调用,对需要清理的方法进行清理。

 

这是一个用来切分 key:value;key:value 这种字符串,返回结果为key, value两个字段。

import java.util.ArrayList;

import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

public class ExplodeMap extends GenericUDTF{

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

    @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("col1");
        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        fieldNames.add("col2");
        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);

        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,fieldOIs);
    }

    @Override
    public void process(Object[] args) throws HiveException {
        String input = args[0].toString();
        String[] test = input.split(";");
        for(int i=0; i<test.length; i++) {
            try {
                String[] result = test[i].split(":");
                forward(result);
            } catch (Exception e) {
                continue;
            }
        }
    }
}

 

 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

 

Appendix:

一个用于将字符串拆分成多个字段的:

import java.util.ArrayList;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.WritableConstantIntObjectInspector;

/**
 * GenericUDTFRD: this
 * 
 */
@Description(name = "tr_rd", value = "_FUNC_(x)")
public class GenericUDTFRD extends GenericUDTF {

	private static Log LOG = LogFactory.getLog(GenericUDTFRD.class.getName());

	@Override
	public void close() throws HiveException {
	}

	@Override
	public StructObjectInspector initialize(ObjectInspector[] args)
			throws UDFArgumentException {
		LOG.debug("========================initialize");
		LOG.debug("args.length" + args.length);
		if (args.length != 2) {
			throw new UDFArgumentLengthException(
					"ExplodeMap takes only two argument");
		}

		WritableConstantIntObjectInspector x = (WritableConstantIntObjectInspector) args[1];
		int numCols = x.getWritableConstantValue().get();
		LOG.debug("numCols:" + numCols);
		// construct output object inspector
		ArrayList<String> fieldNames = new ArrayList<String>(numCols);
		ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>(
				numCols);
		for (int i = 0; i < numCols; ++i) {
			fieldNames.add("c" + i);
			fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
		}
		return ObjectInspectorFactory.getStandardStructObjectInspector(
				fieldNames, fieldOIs);
	}

	@Override
	public void process(Object[] o) throws HiveException {
		LOG.debug("========================process");
		String input = o[0].toString();
		//字段分隔符
		String[] test = input.split("\t");
		LOG.debug("input:" + input);
		LOG.debug("test:" + test);
		for(int i=0;i<test.length;i++){
			if("".equals(test[i])||null==test[i]){
				test[i]="\\N";
			}
		}
		forward(test);
	}

	@Override
	public String toString() {
		return "tr_rd";
	}
}

 

用法是:

--将一个字段,拆分成3个。
select tr_rd(tt.col1,3) as (c1,c2,c3)
from table tt

 

 

 

分享到:
评论

相关推荐

    HiveUDTF:此Hive UDTF将复制第一个输入列

    此Hive UDTF将复制第一个输入列 一种。 如何制作罐子 mvn package ## b。 准备一个带有示例数据的Hive表 在Hive CLI中,创建测试表: create table testudtf (a string, b string) ROW FORMAT DELIMITED FIELDS ...

    分布式数据仓库Hive大全

    6.2 UDTF 39 6.2.1 Explode 39 7. HIVE 的MAP/REDUCE 41 7.1 JOIN 41 7.2 GROUP BY 42 7.3 DISTINCT 42 8. 使用HIVE注意点 43 8.1 字符集 43 8.2 压缩 43 8.3 count(distinct) 43 8.4 JOIN 43 8.5 DML操作 44 8.6 ...

    Hive用户指南

    6.2 UDTF 39 6.2.1 Explode 39 7. HIVE 的MAP/REDUCE 41 7.1 JOIN 41 7.2 GROUP BY 42 7.3 DISTINCT 42 8. 使用HIVE注意点 43 8.1 字符集 43 8.2 压缩 43 8.3 count(distinct) 43 8.4 JOIN 43 8.5 DML操作 44 8.6 ...

    【官网汉化中文】Hive函数运算符使用方法大全

    hive所有函数 包括UDTs、UDAF、UDTF函数和运算符等,中文汉化,翻译并测试

    UDTF函数不生效问题.doc

    UDTF函数不生效问题

    获取最大分区UDTF函数.doc

    获取最大分区UDTF函数

    解析Json函数UDTF函数2.doc

    解析Json函数UDTF函数2

    解析Json函数UDTF函数1.doc

    解析Json函数UDTF函数1

    Hive的基础操作教学

    Hive常用数据类型介绍,表创建,内外部表、分区分桶表介绍,hive内置函数,UDTF,UDAF函数介绍,hive数据的导入导出以及JDBC配置方法。详细介绍了hive一些函数的使用和应用。

    spark-hive-udf:Spark Hive UDF示例

    Spark Hive UDF示例 建立项目 mvn clean package 将spark-hive-udf-1.0.0-SNAPSHOT.jar复制到边缘节点临时目录 spark-hive-udf]# cp target/spark-hive-udf-1.0.0-SNAPSHOT.jar /tmp 通过提供罐子来启动火花壳 spark...

    hive列转行案例

    hive列转行 1.函数说明 EXPLODE(col):将 hive 一列中复杂的 array 或者 map 结构拆分成多行。 LATERAL VIEW : 用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias 解释:用于和 split, explode 等 ...

    通俗易懂的Hive升级版教程(含配套资料)

    Hive是基于Hadoop的一个数据仓库工具,将繁琐的MapReduce程序变成了简单方便的SQL语句实现,深受广大软件开发工程师喜爱。...更新:课件升级、添加自定义UDTF函数、企业常用函数以及更多企业面试真题详细讲解

    hive

    Apache Hive(TM)数据仓库软件有助于查询和... HiveQL还可以使用自定义标量函数(UDF),聚合(UDAF)和表函数(UDTF)进行扩展。https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-standalone-metastore-3.0.0/

    hive-udf:hive自定义函数

    hive-udfhive自定义函数主要实现hive3种自定义函数1,udf函数,主要用于处理一对一数据处理2,udtf函数,主要用于处理一对多数据处理2,udaf函数,主要用与处理多对一数据聚合处理

    hive-udf-tools:hive udf 部署工具,开发工具...

    调用FunctionRegistry.registerUDTF 注册udtf 3 打包 mvn clean package 4 上传相应jar包到$HIVE_HOME/auxlib目录下 让hive自动加载udf包(该过程只需要一次执行,目前适应于hive-0.13.1环境) 1 如果hive-site.xml...

    javasql笔试题-spark-hive-udf:展示如何在ApacheSpark中使用HiveUDF的示例项目

    Hive UDF 项目 介绍 该项目只是一个示例,包含多个 (UDF),用于 Apache Spark。 它旨在演示如何在 Scala 或 Java 中构建 Hive UDF 并在 . 为什么要使用 Hive UDF? Hive UDF 的一个特别好的用途是与 Python 和 ...

Global site tag (gtag.js) - Google Analytics