hive udtf 输入一列返回多行多列

之前说到了hive udf,见https://blog.csdn.net/liu82327114/article/details/80670415

UDTF(User-Defined Table-Generating Functions) 用来解决 输入一行输出多行(On-to-many maping) 的需求。

继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF,实现initialize, process, close三个方法。

UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型)。

初始化完成后,会调用process方法,真正的处理过程在process函数中,在process中,每一次forward()调用产生一行;如果产生多列可以将多个列的值放在一个数组中,然后将该数组传入到forward()函数。

最后close()方法调用,对需要清理的方法进行清理。

1.创建maven工程

file->project structure->modules->点击+号->new module->选择maven

点击next,填写groupid(对应包结构)、artifactid(maven仓库对应的坐标)

source java 代码,操作如下图file->project structure,

点击apply,

2.开始写java代码

添加maven依赖

<dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>0.13.1</version>
    </dependency>

代码如下

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.json.JSONArray;

import java.util.ArrayList;

public class helloudtf extends GenericUDTF {

@Override

// 可接收参数数组

public void process(Object[] objects) throws HiveException {
        String input = objects[0].toString();
            String[] result = new String[2];
            result[0] = input;
            result[1] = input+input;
            String[] result1 = new String[2];
            result1[0] = input+"a";
            result1[1] = input+"a"+input;
            forward(result);//一个forward 代表一行
            forward(result1);

}
    @Override
    public StructObjectInspector initialize(ObjectInspector[] args)
            throws UDFArgumentException {
        if (args.length != 1)www.leyouzaixian2.com {
            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 = www.ruishengks.com new ArrayList<ObjectInspector>();
        fieldNames.add("col1");
        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        fieldNames.add("col2");
        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringO www.baidu620.com bjectInspector);

//定义了行的列数和类型
        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,fieldOIs);
    }
    @Override
    public void close() throws HiveException {

}

}

3.编包上传到hdfs

在此项目pom文件的路径下执行mvn clean install

将target文件中生成的jar文件上传到hdfs上,路径自己自定义,我直接上传到/。

sudo -u hdfs hdfs dfs -put testudf-1.0-SNAPSHOT.jar /

4.使用hivesql或者sparksql加载自定义函数

beeline -u jdbc:hive2://node113.leap.com:10000 -n hive

create function test.iptonum as ‘com.liubl.helloudtf‘ using jar ‘hdfs:///testudf-1.0-SNAPSHOT.jar‘;

(com.liubl.HelloUdf为代码类的全路径自己去粘贴一下)

(测试sql见图)

UDTF的使用:

UDTF有两种使用方法,一种直接放到select后面,一种和lateral view一起使用。

1:直接select中使用:select explode_map(properties) as (col1,col2) from src;

  • 不可以添加其他字段使用:select a, explode_map(properties) as (www.mcyllpt.com/  col1,col2) from src
  • 不可以嵌套调用:select explode_www.yongshiyule178.com map(explode_map(properties)) from src
  • 不可以和group by/cluster by/distribute by/sort www.078881.cn  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 www.yigouylpt2.cn   lateral view explode_map(properties) mytable as col1, col2;

    • 此方法更为方便日常使用。执行过程相当于单独执行了两次抽取,然后union到一个表里

原文地址:https://www.cnblogs.com/qwangxiao/p/9188690.html

时间: 2024-10-01 20:23:32

hive udtf 输入一列返回多行多列的相关文章

列转行且行转列

原数据格式如下: 这是学生的成绩表,每科为一列,要求转换为下面的格式: 即,把把课程列转换为行,把学生行转换为列: 建表: create table #a(name varchar(20),english int,chinese int ,math int)insert into #a values( 'zhangsan',10,39,40)insert into #a values( 'lisi',16,25,36) 思路:先把列转换为行: select name,km,scorefrom(s

一行多列变多行多列 &nbsp;

问题: aa bb cc dd ee ff gg hh ii jj kk ll mm nn oo pp拆分为:aa    bb    cc    dd ee    ff    gg     hh ii      jj    kk     ll mm  nn  oo     pp 解答: xargs -n4 awk -vRS=' ' 'ORS=NR%4?" ":"\n"' sed 's/ /\n/4;P;D' 一行多列变多行多列

hive列转行、行转列

1.列转行 select  t.cust_id          ,concat_ws(',',collect_list(group_id)) one_pace  from (select   'A_001' cust_id                       ,'20191014' group_id           union all           select   'A_001' cust_id                      ,'20191015' group_

MySQL 行转列 -》动态行转列 -》动态行转列带计算

Pivot Table Using MySQL - A Complete Guide | WebDevZoomhttp://webdevzoom.com/pivot-table-using-mysql/ Cross-Tabulation (Pivot Tables) with MySQL - CodeProjecthttps://www.codeproject.com/articles/363339/cross-tabulation-pivot-tables-with-mysql Pivot T

C#动态操作DataTable(新增行、列、查询行、列等)

方法一:动态创建一个DataTable ,并为其添加数据 public void CreateTable()        {            //创建表            DataTable dt = new DataTable();                        //1.添加列            dt.Columns.Add("Name", typeof(string)); //数据类型为 文本 //2.通过列架构添加列            Data

经典SQL问题: 行转列&lt;转&gt;

转 经典SQL问题: 行转列 发表于5个月前(2015-09-19 17:49)   阅读(2905) | 评论(0) 20人收藏此文章, 我要收藏 赞0 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列.数据库grade里面数据如下图,假定每个人姓名都不一样,作为主键.本文以MySQL为基础,其他数据库会有些许语法不同. 数据库数据: 处理后效果: 下面介绍三种方法: 方法一: ? 1 2 3 4 5 SELECTDISTINCT a.name, (SELE

经典SQL问题: 行转列

学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列.数据库grade里面数据如下图,假定每个人姓名都不一样,作为主键.本文以MySQL为基础,其他数据库会有些许语法不同. 数据库数据: 处理后效果: 下面介绍三种方法: 方法一: SELECTDISTINCT a.name, (SELECTscoreFROMgrade bWHEREa.name=b.nameANDb.course='语文')AS'语文', (SELECTscoreFROMgrade bWHEREa

SQLserver行转列与列转行

行表: 行表 姓名 属性 属性值 JACK 身高 180 JACK 体重 80 JACK 年龄 27 TOM 身高 164 TOM 体重 59 TOM 年龄 20 列表: 列表 姓名 身高 年龄 体重 JACK 180 27 80 TOM 164 20 59 行转列就是将行表转换为列表,反之为列转行. --================================================================== ----------------------------行

SQL行转列 (及EAV模型获取数据)

参考文章: http://www.williamsang.com/archives/1508.html 情景简介 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列.数据库grade里面数据如下图,假定每个人姓名都不一样,作为主键.本文以MySQL为基础,其他数据库会有些许语法不同. 数据库数据: 处理后效果: 下面介绍三种方法: 方法一: 1 2 3 4 5 SELECT DISTINCT  a.name, (SELECT score FROM grade b