`
安铁辉
  • 浏览: 244631 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

hive wiki -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方法,对传入的参数进行处理,可以通过forword()方法把结果返回。最后close()方法调用,对需要清理的方法进行清理。
下面是我写的一个UDTF解析json格式,比较纠结的是这个字段很多时候不满足json的定义,有{}值,Null一些情况,做了很多判断,不知道页面展示怎么通过的
package com.taobao.voc.hive.udtf;

public class CopyOfUDTFJson2Rows extends GenericUDTF {

	@Override
	public StructObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException {

		if (args.length != 1 && args.length != 2) {
			throw new UDFArgumentLengthException("UDTFSplitValue takes only one or two argument");
		}

		if (args[0].getCategory() != ObjectInspector.Category.PRIMITIVE) {
			throw new UDFArgumentException("UDTFSplitValue takes string as a parameter");
		}

		ArrayList<String> fieldNames = new ArrayList<String>();
		ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();

		fieldNames.add("col");
		fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);

		return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
	}

	public void process(Object[] args) throws HiveException {
		JSONObject json;
		try {
			json = new JSONObject(args[0].toString());
			if (json.has("bzwd")) {
				String bzwd = json.getString("bzwd");
				bzwd = new JSONObject(bzwd).getString("data");
				JSONObject asks = new JSONObject(bzwd);
				String result = "";
				for (int i = 0; i < asks.getJSONArray("child").length(); i++) {
					result = result + getAskAnswer(asks.getJSONArray("child").getJSONObject(i), 1, (i + 1) + "");
				}
				String[] split = result.split("\n");
				System.out.println(Thread.currentThread().getName() + " " + result);
				for (int i = 0; i < split.length; i++) {
					String[] temp = { split[i] };
					forward(temp);
				}
			} else {
				forward(new String[] { "非标准化问题", "非标准化问题", "非标准化问题", "非标准化问题" });
			}
		} catch (JSONException e) {
			e.printStackTrace();
		}

	}

	/**
	 * @param pNode
	 * json数组 level 问答层级 line 问和答属于第几条线路
	 * */
	public String getAskAnswer(JSONObject pNode, int level, String sLine) throws JSONException {
		String final_result = "";
		if (!pNode.toString().isEmpty() && pNode.has("value") && pNode.has("index")) {
			final_result = final_result + "p_id:" + pLine(sLine) + ";s_id:" + sLine + ";level:" + level + ";ask_id:"
					+ pNode.get("index") + ";answer_id:" + pNode.get("value") + "\n";
		}
		// 子节点有子节点,并且子节点是有效的答案(即value字段有值)
		if (pNode.has("child") && pNode.has("value")) {
			System.out.println(pNode.get("value"));
			for (int j = 0; j < pNode.getJSONArray("child").length(); j++) {
				if (ifContinue(pNode)) {
					final_result = final_result
							+ getAskAnswer(pNode.getJSONArray("child").getJSONObject(j), level + 1, sLine(sLine, j));
				}
			}
		}
		return final_result;
	}
//几个判断节点是否为空和获取p_id的函数省略
}


UDTF有两种使用方法,一种直接放到select后面,一种和lateral view一起使用。
输入格式为JSON
添加jar
add jar /home/taobao/dw_hive/hivelets/smoking/ext/tsa/hivesql/udf/Json2rows.jar;
CREATE TEMPORARY FUNCTION jrow  AS 'com.taobao.voc.hive.udtf.UDTFJson2Rows';
1:直接select中使用:
select jrow(ext_attrs) as format_memo from s_tpp_case_universal;
2:和lateral view一起使用:
select id,format_memo,gmt_create,gmt_modified from s_tpp_case_universal  lateral view jrow(ext_attrs) b as format_memo;
结果:
p_id:0;s_id:1;level:1;ask_id:dpxxwh1;answer_id:ppxgwt2
p_id:1;s_id:1.1;level:2;ask_id:ppxgwt1;answer_id:pptj2
p_id:1.1;s_id:1.1.1;level:3;ask_id:pptj1;answer_id:pptjtjh2
p_id:1.1.1;s_id:1.1.1.1;level:4;ask_id:pptjh1;answer_id:yyshjg2
p_id:1.1.1.1;s_id:1.1.1.1.1;level:5;ask_id:yyshjg1;answer_id:pptjbtg2
p_id:1.1.1.1.1;s_id:1.1.1.1.1.1;level:6;ask_id:shjgbtg1;answer_id:shcw2
分享到:
评论
2 楼 安铁辉 2013-05-15  
sarahtest 写道
GREAT,HIVE真心强大啊

是的,hive+函数,确实很强大
1 楼 sarahtest 2013-03-28  
GREAT,HIVE真心强大啊

相关推荐

    含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-3.1.2-bin.tar.gz

    含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-3.1.2-bin.tar.gz 含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-3.1.2-bin.tar.gz 含两个文件hive-jdbc-3.1.2-standalone.jar和apache-hive-...

    apache-hive-2.1.1-bin.tar

    apache-hive-2.1.1-bin.tar apache-hive-2.1.1-bin.tar apache-hive-2.1.1-bin.tarapache-hive-2.1.1-bin.tar apache-hive-2.1.1-bin.tar apache-hive-2.1.1-bin.tarapache-hive-2.1.1-bin.tar apache-hive-2.1.1-...

    hive2.1.1-cdh6.3.2

    1. **hive-jdbc-2.1.1-cdh6.3.2-standalone.jar**:这是Hive JDBC的独立版本,包含了所有必要的依赖,可以直接在没有其他CDH库的环境中运行。开发者可以将这个JAR文件添加到他们的项目中,以便通过Java应用程序或Web...

    Hive-2.1.1-CDH-3.6.1 相关JDBC连接驱动 Jar 包集合

    02、hive-exec-2.1.1-cdh6.3.1.jar 03、hive-jdbc-2.1.1-cdh6.3.1.jar 04、hive-jdbc-2.1.1-cdh6.3.1-standalone.jar 05、hive-metastore-2.1.1-cdh6.3.1.jar 06、hive-service-2.1.1-cdh6.3.1.jar 07、libfb303-...

    gmall-udtf.zip

    【标题】"gmall-udtf.zip"是一个与大数据处理相关的压缩文件,很可能包含了用于电商数据分析的用户定义函数(User Defined Table Functions, UDTF)。UDTF是大数据处理框架如Hadoop、Spark或Hive中的一个重要组件,...

    hive驱动包hive-jdbc-uber-2.6.5.0-292.jar(用户客户端连接使用)

    标题中的"**hive-jdbc-uber-2.6.5.0-292.jar**"是一个Uber(也称为Shaded)JAR文件,它集成了Hive JDBC驱动的所有依赖项。Uber JAR的目的是为了方便部署,因为它将所有必需的库合并到一个单一的文件中,避免了类路径...

    Apache Hive(apache-hive-3.1.3-bin.tar.gz)

    Apache Hive(apache-hive-3.1.3-bin.tar.gz、apache-hive-3.1.3-src.tar.gz)是一种分布式容错数据仓库系统,支持大规模分析,并使用 SQL 促进读取、写入和管理驻留在分布式存储中的 PB 级数据。Hive 构建在 Apache...

    hive-jdbc-3.1.2-standalone

    hive-jdbc-3.1.2-standalone适用于linux

    hive-jdbc-2.1.1-cdh6.2.0-standalone.jar

    hive-jdbc-2.1.1-cdh6.2.0(ieda等jdbc链接hive2.1.1);cdh6.2.0安装的hive2.1.1

    hive-jdbc-1.2.1-standalone.jar

    hive-jdbc-1.2.1-standalone.jar hive-jdbc驱动jar包,欢迎下载

    hive-jdbc-uber-2.6.5.jar

    hive-jdbc-uber-2.6.5.0-292.jar DbVisualizer (as of version 9.5.5) Below is an example configuration using DbVisualizer: Open the Diver Manager dialog ("Tools" &gt; "Driver Manager...") and hit the ...

    DBeaver链接hive驱动包下载: hive-jdbc-uber-2.6.5.0-292.jar

    《DBeaver与Hive连接:hive-jdbc-uber-2.6.5.0-292.jar驱动详解》 在大数据处理领域,Hive作为一个基于Hadoop的数据仓库工具,广泛用于数据查询和分析。而DBeaver,作为一款跨平台的数据库管理工具,以其用户友好的...

    hive-jdbc-3.1.2-standalone.jar

    Hive连接的jar包——hive-jdbc-3.1.2-standalone.jar,使用数据库连接软件连接数据仓库时需要使用相应的驱动器驱动,希望对大家有所帮助

    hive-jdbc-2.1.0-standalone.jar

    hive-jdbc-2.1.0-standalone.jar

    hive-exec-*.jar包

    Missing Hive Execution Jar: /hive/hive1.2.1/lib/hive-exec-*.jar

    hive-jdbc-2.3.7-standalone.jar

    hive-jdbc-2.3.7-standalone,可用dbeaver连接hive数据库,在工具中进行数据库记录的新增改查

    hive-hcatalog-core-1.2.1.jar

    hive-hcatalog-core-1.2.1.jarhive-hcatalog-core-1.2.1.jarhive-hcatalog-core-1.2.1.jar

    hive-jdbc-uber-3.1.2+yanagishima-18.0

    这里我们关注的是"Hive-jdbc-uber-3.1.2",这是一个包含所有依赖的Uber jar包,旨在简化部署和使用流程。 Hive JDBC Uber 3.1.2是Hive的Java数据库连接器的一个优化版本,它通过将所有必需的依赖项打包到一个单一的...

    apache-hive-3.1.2-bin.tar.gz

    3. `conf/`:默认的配置文件,如`hive-default.xml`和`hive-site.xml`,用户可以在此修改Hive的行为。 4. `scripts/`:包含Hive的一些初始化和管理脚本。 5. `metastore/`:元数据存储相关的库和脚本,Hive使用元...

Global site tag (gtag.js) - Google Analytics