`
yugouai
  • 浏览: 498495 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Hive中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()方法调用,对需要清理的方法进行清理。

 


下面是UDTF函数是用来切分”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到一个表里。

 

 

分享到:
评论

相关推荐

    hive UDF需要jar包

    注册完成后,UDF就可以在Hive SQL查询中使用了。例如,`SELECT my_udf(column) FROM table;` 7. **Hadoop生态兼容性**: 注意,确保Hive和Hadoop的版本兼容,否则可能会出现类加载错误或其他运行时问题。 8. **...

    获取最大分区UDTF函数.doc

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

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

    10. **Hive与Java的关系**:虽然Hive提供了SQL接口,但其底层实现大量依赖Java,包括编写自定义函数、与Hadoop生态系统交互等,都需要Java知识。 11. **Hadoop的使用**:Hive运行在Hadoop之上,利用Hadoop的分布式...

    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的...

    解析Json函数UDTF函数2.doc

    本文介绍了如何在Hive中使用UDTF来解析JSON数据,并通过具体步骤指导读者完成UDTF的开发与部署。通过这种方式,可以更高效地处理复杂数据,提高数据分析效率。在未来的大数据处理领域,UDTF将会扮演越来越重要的角色...

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

    通过以上内容的学习,你将能熟练掌握Hive在大数据处理中的运用,理解其数仓设计原则,编写高效的Hive SQL查询,以及根据业务需求定制函数,并懂得如何调整参数来优化Hive的运行效率。在实践中,你可以结合实际数据集...

    深入浅出学习HIVE.pdf

    Hive高级编程包括UDF、UDAF和UDTF,分别代表用户定义函数、用户定义聚合函数和用户定义表生成函数。HiveJDBC是Java数据库连接接口,用于连接和操作Hive数据。 Hive参数包括配置参数和执行命令参数。Hive优化涉及...

    hive的自定义函数

    通过本文介绍,我们了解了Hive UDF的基本概念及其编写与使用方法。使用UDF可以显著增强Hive的功能,使其更好地适应复杂的数据处理需求。希望本文能够帮助你在实际工作中更好地利用Hive UDF解决实际问题。

    尚硅谷大数据之Hive视频

    1. **提高效率**:使用Hive可以避免编写复杂的MapReduce程序,大大提高了开发效率。 2. **易用性**:对于熟悉SQL的人来说,学习Hive的成本较低,因为它的语法与传统的关系型数据库非常相似。 3. **数据处理能力**:...

    Cloudera Hive 文档

    9. **Hive UDF(用户自定义函数)**:Hive 允许用户扩展其功能,通过编写 UDF、UDAF(用户自定义聚合函数)和 UDTF(用户自定义表生成函数),满足特定的业务需求。 10. **Hive 与其它大数据组件的整合**:Hive ...

    Hive的Udf函数进行数据脱敏

    在Hive中,UDF分为三种类型:UDF(单行函数)、UDAF(累积聚合函数)和UDTF(多行转换函数)。在这里,我们只需要UDF,因为它适用于处理单行数据。 1. **编写Java类**: 要创建一个UDF,你需要编写一个Java类,该...

    hive按月份加减udf范例

    在实际应用中,用户可能需要将这个Java类编译成jar包,然后在Hive中通过`ADD JAR`命令加载这个jar,最后使用`CREATE TEMPORARY FUNCTION`语句注册这个UDF,以便在查询中使用。 总结来说,这个示例展示了如何利用...

    自定义hive函数

    但是,Hive 3.1版本后已不再支持UDTF,推荐使用Lateral View与UDTF类似功能。 综上所述,自定义Hive函数(UDF、UDAF)极大地增强了Hive的功能,使其能处理各种复杂的业务逻辑,适应不同的数据处理需求。开发和使用...

    programming_hive-master.zip

    通过对这些代码的学习,可以掌握Hive的使用方法,理解Hive如何处理大数据,以及如何编写高效的HQL语句。 此外,Hive的优化策略也是学习的重点,包括选择合适的分区策略、使用索引、调整执行计划、优化JOIN操作等。...

    hive1.2.2源代码

    源代码中包含了这些接口的定义,开发者可以根据需要编写自己的函数并集成到Hive中。 六、性能调优 通过分析源代码,我们可以找出潜在的性能瓶颈,并进行针对性的优化。比如,调整Metastore的配置以改善元数据访问...

    HIve UDF 说明书

    Hive UDF(User-Defined Functions,用户定义函数)是Hive中强大的功能,允许用户在Hive查询中使用自定义的函数来进行更复杂的操作。Hive是一个建立在Hadoop基础上的高级数据仓库工具,它允许用户使用类似SQL的语言...

    apache-hive-0.14.0-bin.tar.gz

    通过Hive,用户可以编写SQL语句来操作HDFS(Hadoop Distributed File System)中的大量数据,无需了解底层的MapReduce或Pig等复杂大数据处理框架。 在"apache-hive-0.14.0-bin"这个压缩包中,包含了以下关键组件和...

    大数据面试 Hive 八股文

    Hive是大数据领域中一个重要的数据仓库工具,它设计的目标是为大规模数据集提供数据查询和分析能力。由于Hive提供了类似SQL的查询语言(HQL),使得非Java背景的分析师也能轻松进行大数据处理。下面我们将深入探讨...

    Hive编程指南

    1. **元数据**:Hive管理的数据的结构信息,如表名、列名、列类型、表分区等,这些元数据存储在数据库中,通常使用MySQL或Derby。 2. **HQL(Hive Query Language)**:Hive提供的SQL方言,允许用户以SQL语法对...

Global site tag (gtag.js) - Google Analytics