`
dacoolbaby
  • 浏览: 1267424 次
  • 性别: 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 ...

    解析Json函数UDTF函数2.doc

    ### 解析Json函数UDTF函数2 - Hive UDTF详解 #### 一、UDTF(User Defined Table Generating Functions)概述 在Hive中,UDTF(User Defined Table Generating Functions)是一种特殊的用户自定义函数,用于处理单个...

    hive UDF需要jar包

    这些函数可以是单行输入单行输出的UDF,多行输入单行输出的UDF(UDAF,User Defined Aggregation Function),或者多行输入多行输出的UDTF(User Defined Table Generating Function)。 2. **Java编程**: Hive ...

    获取最大分区UDTF函数.doc

    本文将详细介绍如何在Hive中使用用户定义的表函数(User Defined Table Generating Function,简称UDTF)来实现这一功能。 #### 二、UDTF简介 UDTF是一种特殊的用户自定义函数,它可以返回多行记录或表。与传统的...

    apache-hive-2.3.9-bin.tar大数据HIVE.zip

    6. **存储过程(UDF,UDAF,UDTF)**:Hive支持用户自定义函数(UDF),用户定义聚合函数(UDAF)和用户定义表生成函数(UDTF),允许扩展Hive的功能。 7. **连接Hadoop生态系统**:Hive与Hadoop生态系统的其他组件...

    UDTF函数不生效问题.doc

    具体表现为:创建了UDTF函数后,在本地Hive连接中可以正常调用该函数,但在通过HiveServer2进行远程连接时却无法调用该UDTF函数。这种现象通常称为“UDTF函数不生效”。 #### 三、原因分析 出现上述问题的主要原因...

    hive数仓、hive SQL 、 hive自定义函数 、hive参数深入浅出

    - UDTF(用户定义的表生成函数):将一行数据转换为多行,常用于数据拆分。 4. Hive参数调优: - 内存参数:如mapreduce.map.memory.mb、hive.server2.executor.memory.overhead等,合理设置可避免内存溢出。 - ...

    Apache Hive Functions Cheat Sheet

    首先,Hive提供了多种函数类型,包括用户定义函数(UDF)、用户定义聚合函数(UDAF)、用户定义表生成函数(UDTF)和宏。用户定义函数(UDF)是一个接受一个或多个行中的列作为参数,并返回一个值或对象的函数,例如...

    hive影评案例.zip

    4. **MovieTypeUDTF.java** - 这是一个Java源代码文件,名字中的"UDTF"通常代表User Defined Table-Valued Function,这是Hive中的一种函数类型,用于扩展Hive的功能,将单行输入转换为多行输出。这个特定的函数可能...

    解析Json函数UDTF函数1.doc

    为了解决这一问题,可以通过自定义表函数(UDTF, User Defined Table Function)的方式扩展Hive的功能。本篇文章将详细介绍如何创建一个用于解析JSON数组的UDTF函数——`getJsonArrSingle`,并提供具体的实现步骤和...

    apache-hive-1.2.1源码包(已编译)(含Hive的使用全解)

    Hive可以通过编写自定义函数(UDF, User Defined Function)、UDAF(UDAF, User Defined Aggregate Function)和UDTF(User Defined Table Generating Functions)扩展其功能,满足特定业务需求。 9. **Hive与HBase的...

    大数据面试 Hive 八股文

    6. **Hive的三种自定义函数(UDF、UDTF、UDAF)** - **UDF**:一对一函数,用于基本的数据转换。 - **UDTF**:一对多函数,会产生多行输出。 - **UDAF**:多对一函数,用于聚合操作,如COUNT、SUM。 7. **Hive的...

    Hive用户指南 Hive user guide 中文版

    - **UDTF**:用户定义的表生成函数,如`EXPLODE`用于展开数组或映射类型。 #### 七、Hive的MapReduce - Hive内部使用MapReduce来执行查询。 #### 八、使用Hive注意事项 - **字符集问题**:在处理文本数据时需要...

    Hive收集的电子文档

    7. **存储过程(UDF/UDAF/UDTF)**:Hive支持用户自定义函数,包括UDF(单行函数)、UDAF(聚合函数)和UDTF(多行函数),以扩展其功能。 8. **Hive与MapReduce的关系**:Hive将HQL转换为一系列的MapReduce任务...

    apache-hive-0.14.0-bin.tar.gz

    6. **Hive UDF(User Defined Functions)**:允许用户自定义函数来扩展Hive的功能,包括UDF(单行函数)、UDAF(聚合函数)和UDTF(多行函数)。 7. **Hive Web Interface (WebHive)**:一个基于Web的界面,让用户...

    尚硅谷大数据之Hive视频

    2. **可扩展性**:Hive允许用户自定义函数(UDF)、聚合函数(UDAF)和表函数(UDTF),这使得Hive具有高度的灵活性。 3. **批处理能力**:通过将SQL语句转换成MapReduce任务,Hive非常适合用于处理大规模数据集的...

    大数据系列-Hive

    5. **Hive UDF(用户自定义函数)**:Hive允许用户扩展其功能,自定义UDF、UDAF(用户自定义聚合函数)和UDTF(用户自定义转换函数),以处理特定的数据分析需求。 ### 0203 Hive 高级进阶 1. **Hive性能优化**:...

    hive1.2.2源代码

    Hive支持用户自定义函数(UDF)、用户定义聚合函数(UDAF)和用户定义表函数(UDTF),这在处理复杂的数据分析需求时非常有用。源代码中包含了这些接口的定义,开发者可以根据需要编写自己的函数并集成到Hive中。 ...

    分布式数据仓库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 ...

Global site tag (gtag.js) - Google Analytics