文档章节

hive 的udtf使用

晨磊
 晨磊
发布于 2015/03/19 14:41
字数 343
阅读 54
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

python生成HTML报告

# -*- coding=utf-8 -*-# author=zyqimport timeclass Template(object): '''html报告''' HTML_TEMP=''' <!DOCTYPE html> <html lang="en"> <head......

小白兔_球球
5分钟前
0
0
模型融合资料汇总

https://blog.csdn.net/u012526003/article/details/79109418https://blog.csdn.net/willduan1/article/details/73618677https://blog.csdn.net/wstcjf/article/details/77989963?utm_so......

KYO4321
7分钟前
0
0
热更步骤

根据官方文档: http://docs.cocos.com/creator/manual/zh/advanced-topics/hot-update.html version_generator.js文件放到项目根目录下 注意步骤的顺序: 1.构建 2.根据构建目录运行下面命令...

Valiancer
8分钟前
0
0
小程序重写CheckBox样式

CheckBox /* 重写 checkbox 样式 *//* 未选中的 背景样式 */checkbox .wx-checkbox-input{ border-radius: 50%; width: 40rpx; height: 40rpx;}/* 选中后的 背景样式...

originDu
12分钟前
0
0
mysql自动安装脚本

[root@localhost_04 ~]# cat mysql.sh #!/bin/bash# "################检查本机安装mysql的基本条件########################"echo "Checking  user :"d=`id -u`if [ $d ......

芬野de博客
25分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部