`
yugouai
  • 浏览: 491734 次
  • 性别: 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到一个表里。

 

 

分享到:
评论

相关推荐

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

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

    hive自定义UDF编写函数.docx

    hive的udf函数实现

    Hive使用手册Hive使用手册

    1 Hive 概念与连接使用: 2 2 Hive支持的数据类型: 2 2.1原子数据类型: 2 2.2复杂数据类型: 2 2.3 Hive类型转换: 3 3 Hive创建/删除数据库 3 3.1创建数据库: 3 3.2 删除数据库: 3 4 Hive 表相关语句 3 4.1 Hive ...

    hive的UDF的编写.docx

    如何使用Java编写hive的UDF,使用的是eclipse,步骤比较详细,也很简单,适用于初学者初学者

    hive的安装与使用

    hive的安装与使用过程,是你不敢相当于还能修复好的哈人家还能够充分股份都是

    HIVE-SQL开发规范.docx

    hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供SQL查询...

    毕业设计,采用Hadoop+Hive构建数据仓库,使用django+echarts构建前端web网站对业务指标进行可视化呈现

    毕业设计,采用Hadoop+Hive构建数据仓库,使用django+echarts构建前端web网站对业务指标进行可视化呈现 1. Hadoop+Hive构建数据仓库 2. django+echarts网站开发 3. 数据清洗,数据模型构建 毕业设计,采用Hadoop+...

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

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

    利用Hive进行复杂用户行为大数据分析及优化案例

    利用Hive进行复杂用户行为大数据分析及优化案例(全套视频+课件+代码+讲义+工具软件),具体内容包括: 01_自动批量加载数据到hive 02_Hive表批量加载数据的脚本实现(一) ...17_Hive中使用Python脚本进行预处理

    Hive用户指南(Hive_user_guide)_中文版.pdf

    因此, Hive 中不支持对数据的改写和添加,所有的数据都是在加载的时候中确定好的。 而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO ... VALUES 添加数据,使用 UPDATE ... SET 修改数据。 ...

    【63课时完整版】大数据实践HIVE详解及实战

    22.Hive中使用自定义UDF实现日期格式转换 23. HiveServer2的介绍及三种连接方式 24.Hive元数据、fetch task和严格模式的介绍 第3章:Sqoop Sqoop及用户行为分析案例 25.CDH版本框架的介绍 26. CDH版本框架的环境...

    部分普通sql查询在hive中的实现方式

    部分普通sql查询在hive中的实现方式详细说明;

    大数据之Hive官方文档简要翻译(中文文档)

    将官方文档做了简要翻译 ...元数据使用JPOX ORM解决方案(Data Nucleus)持久化,因此它支持的任何数据库都可以被Hive使用。大多数商业关 系数据库和许多开源数据库都受到支持。请参阅下面一节中支持的数据库列表。

    hive修改过的jdbc包,用于显示hive中的中文内容

    如果系统语言不是utf-8的话,通过jdbc调用hive的数据时,中文会是乱码,通过修改jdbc包加上utf8标识后就好了,这个是改好了的包

    大数据技术基础实验报告-Hive安装配置与应用.doc

    大数据技术基础实验报告-Hive安装配置与应用

    Apache Hive 中文手册_hive_

    Apache Hive 是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表,并提供...

    hive metastore java api使用

    hive metastore是hive的元数据管理服务,实际应用中很多第三方框架需要访问metastore服务,如spark,impala等。同样hive metastore也提供了java接口。 使用 import org.apache.hadoop.hive.conf.HiveConf; import org...

    presto和hive的使用区别

    Hive是把一个查询转化成多个MapReduce任务,然后一个接一个执行。执行的中间结果通过对磁盘的读写来同步。然而,Presto没有使用MapReduce,它是通过一个定制的查询和执行引擎来完成的。它的所有的查询处理是在内存中...

    Hive中SQL详解

    Hive中SQL详解

    将csv文件放到hive对应的服务器上

    将“數倉數據提供與報表流程開發\码表导入\TY”中csv内容导入hive的码表当中。 目标csv:sfc_b_phase.csv 2、将csv文件放到hive对应的服务器上 hadoop服务器:10.176.153.32 1、将sfc_b_phase.csv放在32的root目录下...

Global site tag (gtag.js) - Google Analytics