HIVE中UDTF编写和使用
浏览:5658次 出处信息
1. UDTF介绍
UDTF(User-Defined Table-Generating Functions) 用来解决 输入一行输出多行(On-to-many maping) 的需求。
2. 编写自己需要的UDTF
下面是我写的一个用来切分”key:value;key:value;”这种字符串,返回结果为key, value两个字段。供参考:
1: import java.util.ArrayList;
2:
3: import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
4: import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
5: import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
6: import org.apache.hadoop.hive.ql.metadata.HiveException;
7: import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
8: import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
9: import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
10: import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
11:
12: public class ExplodeMap extends GenericUDTF{13:
14: @Override
15: public void close() throws HiveException {16: // TODO Auto-generated method stub
17: }
18:
19: @Override
20: public StructObjectInspector initialize(ObjectInspector[] args)
21: throws UDFArgumentException { 22: if (args.length != 1) { 23: throw new UDFArgumentLengthException("ExplodeMap takes only one argument");24: }
25: if (args[0].getCategory() != ObjectInspector.Category.PRIMITIVE) { 26: throw new UDFArgumentException("ExplodeMap takes string as a parameter");27: }
28:
29: ArrayListfieldNames = new ArrayList ();
30: ArrayListfieldOIs = new ArrayList ();
31: fieldNames.add("col1");32: fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
33: fieldNames.add("col2");34: fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
35:
36: return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,fieldOIs);
37: }
38:
39: @Override
40: public void process(Object[] args) throws HiveException {41: String input = args[0].toString();
42: String[] test = input.split(";");43: for(int i=0; i44: try {45: String[] result = test[i].split(":");46: forward(result);47: } catch (Exception e) {48: continue;49: }50: }51: }52: }
3. 使用方法
UDTF有两种使用方法,一种直接放到select后面,一种和lateral view一起使用。
1:直接select中使用:select explode_map(properties) as (col1,col2) from src;
2:和lateral view一起使用:select src.id, mytable.col1, mytable.col2 from src lateral view explode_map(properties) mytable as col1, col2;
4. 参考文档
http://wiki.apache.org/hadoop/Hive/LanguageManual/UDF
http://wiki.apache.org/hadoop/Hive/DeveloperGuide/UDTF
http://www.slideshare.net/pauly1/userdefined-table-generating-functions
建议继续学习:
- 如何获取hive建表语句 (阅读:6932)
- Hive源码解析-之-词法分析器 parser (阅读:6578)
- Hive的入口 -- Hive源码解析 (阅读:5487)
- Hive源码解析-之-语法解析器 (阅读:5098)
- 用hadoop hive协同scribe log用户行为分析方案 (阅读:4663)
- 几个HIVE的streaming (阅读:3979)
- 写好Hive 程序的五个提示 (阅读:3667)
- Impala与Hive的比较 (阅读:3665)
- Hive 随谈(一) (阅读:3228)
- Hive 随谈(二) (阅读:3086)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:使用gcov完成代码覆盖率的测试
文章信息
- 作者:shicheng 来源: 量子数科院
- 标签: HIVE UDTF
- 发布时间:2011-06-02 13:34:51
建议继续学习
近3天十大热文
-
[917] WordPress插件开发 -- 在插件使用 -
[135] 解决 nginx 反向代理网页首尾出现神秘字 -
[54] 整理了一份招PHP高级工程师的面试题 -
[52] Innodb分表太多或者表分区太多,会导致内 -
[52] 海量小文件存储 -
[52] 如何保证一个程序在单台服务器上只有唯一实例( -
[51] 全站换域名时利用nginx和javascri -
[50] 用 Jquery 模拟 select -
[49] CloudSMS:免费匿名的云短信 -
[48] jQuery性能优化指南
