文档章节

hive 的udtf使用

晨磊
 晨磊
发布于 2015/03/19 14:41
字数 343
阅读 68
收藏 0

HIVE的自定义函数,有UDFUDAF,UDTF,分别实现一进一出、多进一出、一进多出的操作

今天只分享一个UDTF的使用,另外两个以后再分享

场景:使用UDTF解析JSON串

废话不多说了,直接上代码

要想写UDTF必须继承GenericUDTF类,并实现initialize,process,close三个方法,initialize定义每行的列名及类型,process方法是对数据的操作,就是把一行拆成多行,注意一行有多列的话,需要是个集合,close方法可以不实现



package dw.udf;

import java.util.ArrayList;
import java.util.Iterator;

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 org.json.JSONObject;

public class JsonParse extends GenericUDTF {//集成GenericUDTF

	@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("containerid");
		fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
		fieldNames.add("first_step");
		fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
		fieldNames.add("second_step");
		fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
		fieldNames.add("third_step");
		fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
		return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
	}

	@SuppressWarnings("rawtypes")
	@Override
	public void process(Object[] args) throws HiveException {
		try {
			JSONObject obj = new JSONObject(args[0].toString());
			Iterator it = obj.keys();
			while (it.hasNext()) {
				String key = (String) it.next();
				JSONArray array = obj.getJSONArray(key);
				if (key.indexOf("&") != -1) {
					key = key.substring(0, key.indexOf("&"));
				}
				String[] outstr = new String[4];
				outstr[0] = key;
				for (int i = 0; i < array.length(); i++) {
					outstr[i + 1] = array.getString(i);
				}
				forward(outstr);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void close() throws HiveException {

	}

}

© 著作权归作者所有

共有 人打赏支持
晨磊
粉丝 2
博文 24
码字总数 16871
作品 0
丰台
程序员
私信 提问
Hive 中的复合数据结构简介以及一些函数的用法说明

目前 hive 支持的复合数据类型有以下几种: map (key1, value1, key2, value2, ...) Creates a map with the given key/value pairs struct (val1, val2, val3, ...) Creates a struct with ......

大数据之路
2013/04/07
0
4
Lateral View用法 与 Hive UDTF explode

Lateral View是Hive中提供给UDTF的conjunction,它可以解决UDTF不能添加额外的select列的问题。 1. Why we need Lateral View? 当我们想对hive表中某一列进行split之后,想对其转换成1 to ...

Avner
01/25
0
0
hive udf、udaf、udtf

1、UDF:用户定义(普通)函数,只对单行数值产生作用; 实现方法: 1. 继承UDF类 2. 重写evaluate方法 3、UDTF:User-Defined Table-Generating Functions,用户定义表生成函数,用来解决输...

张欢19933
08/20
0
0
006.Hive中添加自定义udf udaf udtf等函数的jar文件的三种方法

在开发了hive的udf udaf udtf函数的jar文件后,需要将jar文件放入hive的环境中才可以使用。可以通过以下三种方法加入: 1. 使用add jar path/test.jar;方法加入 该方法的缺点是每次启动Hive的...

片刻
2014/06/20
0
0
hive自定义函数

自定义函数包括三种UDF、UDAF、UDTF UDF(User-Defined-Function) 一进一出 UDAF(User- Defined Aggregation Funcation) 聚集函数,多进一出。Count/max/min UDTF(User-Defined Table-Generat......

张欢19933
2016/09/20
25
0

没有更多内容

加载失败,请刷新页面

加载更多

idea 删除代码的注释

搜索栏使用 正则表达式搜索 (/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/|[ \t]*//.*) 会搜索出来所有注释的代码 用空格replace替换掉就可以了。 或者搜索 (/\*([^*]|[\r\n]|(\*+([^*/]|[\r\...

时刻在奔跑
9分钟前
0
0
eclipse maven 项目运行mvn clean 后无法运行

错误: 错误:找不到或无法加载主类com.yyy.test.Main 解决方法: “project” --"Clean" 参考链接:https://jingyan.baidu.com/article/cbcede07107d9802f40b4dff.html...

qimh
13分钟前
0
0
崛起于Springboot2.X之集成工作流Activiti5.22(42)

声明:该博客主要是Springboot1.X和Springboot2.X集成Activiti5.22版本,并说一下两个版本的搭建不同的地方 技术:Springboot2.0.3+mysql+jpa(自动生成25张表)+Activiti5.22 /然后Springboo...

木九天
23分钟前
3
1
windows环境下搭建rabbitMQ开发环境

windows环境下搭建rabbitMQ开发环境 下载与安装 erlang rabbitmq 是使用erlang语言开发的,所以需要erlang环境; 下载地址 rabbitmq 下载地址 rabbitmq与erlang版本关系 下载之后直接安装即可...

晨猫
35分钟前
1
0
JVM 中的守护线程

特点 通常由JVM启动 运行在后台处理任务,比如垃圾回收等 用户启动线程执行结束或者JVM结束时,会等待所有的非守护线程执行结束,但是不会因为守护线程的存在而影响关闭。 判断线程是否为守护...

小刀爱编程
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部