HIVE中UDTF编写和使用
浏览:5225次 出处信息
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建表语句 (阅读:6662)
- Hive源码解析-之-词法分析器 parser (阅读:5695)
- Hive的入口 -- Hive源码解析 (阅读:4678)
- Hive源码解析-之-语法解析器 (阅读:4118)
- 用hadoop hive协同scribe log用户行为分析方案 (阅读:4104)
- 几个HIVE的streaming (阅读:3352)
- 写好Hive 程序的五个提示 (阅读:3152)
- Hive 随谈(一) (阅读:2831)
- Impala与Hive的比较 (阅读:2789)
- Hive 随谈(二) (阅读:2626)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:使用gcov完成代码覆盖率的测试
文章信息
- 作者:shicheng 来源: 量子数科院
- 标签: HIVE UDTF
- 发布时间:2011-06-02 13:34:51
建议继续学习
近3天十大热文
- [12] 逃出你的肖申克(五):看不见的牢笼(上)
- [10] linux 简单架设防火墙路由器
- [9] 从”引爆点”理论看微博传播
- [9] 卖家反馈影响因素的量化研究(上)
- [9] YSLOW法则中,为什么yahoo推荐用GE
- [9] [Perl]Moose::Manual::T
- [8] 互联网时代的社会语言学:基于SNS的文本数据
- [8] iOS的定位原理揭秘
- [8] Eclipse开发Android应用程序入门
- [8] 关于身份证号的那些事