HIVE中UDTF编写和使用
浏览:5286次 出处信息
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; i 44: 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建表语句 (阅读:6703)
- Hive源码解析-之-词法分析器 parser (阅读:5860)
- Hive的入口 -- Hive源码解析 (阅读:4849)
- Hive源码解析-之-语法解析器 (阅读:4346)
- 用hadoop hive协同scribe log用户行为分析方案 (阅读:4153)
- 几个HIVE的streaming (阅读:3423)
- 写好Hive 程序的五个提示 (阅读:3185)
- Impala与Hive的比较 (阅读:3016)
- Hive 随谈(一) (阅读:2861)
- Hive 随谈(二) (阅读:2644)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:使用gcov完成代码覆盖率的测试
文章信息
- 作者:shicheng 来源: 量子数科院
- 标签: HIVE UDTF
- 发布时间:2011-06-02 13:34:51
建议继续学习
近3天十大热文
- [71] Twitter/微博客的学习摘要
- [66] IOS安全–浅谈关于IOS加固的几种方法
- [65] find命令的一点注意事项
- [64] android 开发入门
- [63] 如何拿下简短的域名
- [63] Go Reflect 性能
- [61] Oracle MTS模式下 进程地址与会话信
- [61] 流程管理与用户研究
- [58] 图书馆的世界纪录
- [58] 读书笔记-壹百度:百度十年千倍的29条法则