文档章节

hive 的udtf使用

晨磊
 晨磊
发布于 2015/03/19 14:41
字数 343
阅读 260
收藏 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
丰台
程序员
私信 提问
加载中

评论(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
3.7W
4
Hadoop3集群搭建之——hive添加自定义函数UDTF (一行输入,多行输出)

上篇: Hadoop3集群搭建之——虚拟机安装 Hadoop3集群搭建之——安装hadoop,配置环境 Hadoop3集群搭建之——配置ntp服务 Hadoop3集群搭建之——hive安装 Hadoop3集群搭建之——hbase安装及简...

osc_1otmny9i
2018/07/09
1
0
DeveloperGuide Hive UDTF

Writing UDTF's Writing UDTF's GenericUDTF Interface GenericUDTF Interface A custom UDTF can be created by extending the GenericUDTF abstract class and then implementing the , , ......

osc_4ptjtnue
2018/09/06
2
0
【Hive学习之六】Hive Lateral View &视图&索引

环境   虚拟机:VMware 10   Linux版本:CentOS-6.5-x86_64   客户端:Xshell4   FTP:Xftp4   jdk8   hadoop-3.1.1   apache-hive-3.1.1 一、Hive Lateral View Lateral Vie...

osc_vwv0jnr8
2019/02/16
3
0
Lateral View用法 与 Hive UDTF explode

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

Avner
2018/01/25
532
0

没有更多内容

加载失败,请刷新页面

加载更多

【Flutter组件终结篇】332个组件 658页PDF

老孟导读:历时1年的时间,整理完成了330+组件的详细用法,不仅包含UI组件,还包含了功能性的组件。 虽然整理了 330+的组件基本用法,但并不是让你每一个都学习一遍,任何技术基本都是掌握 ...

老孟Flutter
58分钟前
17
0
三星手机又中招:一张壁纸可引发系统崩溃 附临时解决方法

  前几天国内有大量用户发现三星手机崩溃、黑屏或者无限重启, 这可能是三星手机的日历 APP 的 bug。这件事还没完,三星手机今天又发现了新的问题,换上一张特别的壁纸就会导致系统崩溃,不...

alkcendkljk
今天
13
0
查找当前目录和文件目录[重复] - Find current directory and file's directory [duplicate]

问题: This question already has answers here : 这个问题已经在这里有了答案 : How to properly determine current script directory? 如何正确确定当前脚本目录? (11 answers) (11个答...

技术盛宴
今天
27
0
你不知道的java对象序列化的秘密

简介 你知道序列化可以使用代理吗?你知道序列化的安全性吗?每个java程序员都听说过序列化,要存储对象需要序列化,要在网络上传输对象要序列化,看起来很简单的序列化其实里面还隐藏着很多...

flydean
今天
21
1
线程池

Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创...

Joker上上签
今天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部